我在7英寸平板电脑(800x480px)的dp计算中遇到一些问题。以下是我的计算方式。找不到在计算中出现错误的地方或想法:

我正在测试三种设备:


Nexus One:800x480px,3.7英寸显示屏(specs
华为Ideos:320x240px,2.8英寸显示屏(specs
Ainol Novo 7英寸平板电脑:800x480px,7英寸显示屏(specs


根据显示尺寸,我正在根据公式手动计算DPI(每英寸点数):

sqrt(w^2 + h^2) / in


所以我得到:


Nexus One:sqrt(800 * 800 + 480 * 480)/3.7 = 252.15dpi
华为Ideos:sqrt(320 * 230 + 240 * 240)/2.8 = 142.86dpi
Ainol Novo 7英寸平板电脑:sqrt(800 * 800 + 480 * 480)/ 7 = 133.28 dp


现在,我要输出屏幕指标的dpi值,并基于此输出,以dp(与密度无关的像素)为单位的屏幕宽度和高度。我的代码是:

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    Log.d(TAG, "ScaledDensity: " + metrics.scaledDensity);
    Log.d(TAG, "Density DPI: " + metrics.densityDpi);

    int widthInPx = 800; // 320 or 800, depending on the respective device width I'm testing
    int widthInDp =(int)(widthInPx/metrics.scaledDensity);
    Log.d(TAG, "width in dp: " + widthInDp);

    int heightInPx = 480; // 240 or 480, depending on the respective device height I'm testing
    int heightInDp =(int)(heightInPx/metrics.scaledDensity);
    Log.d(TAG, "height in dp: " + heightInDp);


结果如下:


Nexus One:
    缩放密度:1.5,密度DPI:240,单位dp宽度:533,单位dp高度:320
华为理念:
    ScaledDensity:0.75,Density DPI:120,dp宽度:426,dp高度:320
Ainol Novo 7英寸平板电脑:
    ScaledDensity:1.0,DPI密度:160,dp宽度:800,dp高度:480


我从活动中的Java代码获取的密度DPI与我计算出的dpi值不同,并且显然被Android舍入为120、160或240之一,这是很正常的。到目前为止没有问题。

问题/问题1:

对于第三台设备,Novo 7“平板电脑:
据说ScaledDensity为1.0,dp的宽度为800,与px数相同。但是,这不是现实。当我创建一个全屏应用并在其上放置视图时,实际上只有533dp x 320dp的视图适合屏幕。因此,它的dp测量值与Nexus One相同。即使Nexus One的DPI值较高,但像素数相同。那怎么可能?

问题/问题2:

我为模拟器创建了AVD,其测量结果与Novo 7“平板电脑完全相同。
我的Java代码中的日志行显示的值与实际平板电脑设备的值相同:


Ainol Novo 7“平板电脑模拟器:
    ScaledDensity:1.0,DPI密度:160,dp宽度:800,dp高度:480


但是,在模拟器上,我可以将580dp x 320 dp的视图放置为在全屏活动中完全可见。在仿真器和实际设备之间,如果测量值完全相同,宽度dp怎么可能不同?



问题/问题3:

http://developer.android.com/guide/practices/screens_support.html上说:


  为了帮助您针对不同类型的产品定位某些设计
  
  设备,以下是一些典型屏幕宽度的数字:
  
  ...
  
  480dp:诸如Streak(480x800 mdpi)之类的Tweener平板电脑。
  
  600dp:7英寸平板电脑(600x1024 mdpi)。
  
  ...


我认为我的平板电脑应该属于以下类别之一,但是,它既没有480宽度也没有600 dp宽度,但是介于两者之间。就我而言,是533dp(真实设备)或580dp(仿真器)。

如果是这样,那么这种“典型的屏幕宽度”概述有什么好处,如果实际上似乎不是这样,但是来自不同供应商的设备可以在标准设备之间具有任何其他随机值?
然后,我可以继续进行并再次使用像素值,因为似乎没有使用dp的全部好处。

最佳答案

啊,我只是忘了排队

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="11" />


在我的清单上。

没有android:minSdkVersion,总会出现问题;我认为Android 1.5有一些遗留问题。

10-07 19:35
查看更多