我在计算 7 英寸平板电脑(800x480 像素)的 dp 时遇到了一些问题。以下是我的计算方式。找不到我在计算中或我的想法中出错的地方:
我正在测试三种设备:
- Nexus One:800x480 像素,3.7 英寸显示屏(规格)
- 华为 Ideos:320x240 像素,2.8 英寸显示屏(规格)
- Ainol Novo 7" 平板电脑:800x480px,7" 显示屏(规格)
根据显示尺寸,我根据公式手动计算 DPI(每英寸点数):
sqrt(w^2 + h^2) / in
所以我得到:
- Nexus One:sqrt(800*800+480*480)/3.7 = 252.15dpi
- 华为理念: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
- 华为 Ideos:ScaledDensity:0.75,Density DPI:120,dp 宽度:426,dp 高度:320
- Ainol Novo 7" 平板电脑:ScaledDensity:1.0,Density DPI:160,dp 宽度:800,dp 高度:480
我从活动中的 java 代码获得的密度 DPI 与我计算的 dpi 值不同,并且显然被 Android 舍入为值 120、160 或 240 之一,这很正常。到目前为止没有问题。
问题/问题1:
使用第三个设备,Novo 7" 平板电脑:据说 ScaledDensity 是 1.0,据说 dp 中的宽度是 800,与像素数相同。但是,事实并非如此;当我创建全屏应用程序时并在那里放置一个视图,实际上只有 533dp x 320dp 的视图适合屏幕。所以它与 Nexus One 的 dp 测量值相同;即使 Nexus One 具有更高的 DPI 值但像素数相同。如何那可能吗?
问题/问题2:
我为模拟器创建了一个 AVD,其精确测量值与 Novo 7" 平板电脑相同。我的 java 代码中的日志行显示的值与真实平板电脑设备的值相同:
- Ainol Novo 7" 平板电脑模拟器:ScaledDensity: 1.0, Density DPI: 160, width in dp: 800, height in dp: 480
但是,在模拟器上,我可以放置一个580dp x 320 dp 的视图,以便在全屏活动中完全可见。仿真器和具有完全相同测量值的真实设备之间的宽度 dp 怎么可能不同?
问题/问题 3:
在http://developer.android.com/guide/practices/screens_support.html它说:
帮助您针对不同类型的一些设计
设备,以下是一些典型屏幕宽度的数字:
...
480dp:像 Streak (480x800 mdpi) 这样的补间平板电脑。
600dp:7 英寸平板电脑 (600x1024 mdpi)。
...
我认为我的平板电脑应该属于这些类别之一,但是,它既没有 480 宽度也没有 600 dp 宽度,而是介于两者之间;就我而言,是 533dp(真实设备)或 580dp(模拟器)。
如果是这种情况,那么这样的“典型屏幕宽度”概述有什么好处,如果实际上似乎并非如此,但来自不同供应商的设备可以在标准设备之间有任何其他随机值?然后我可以继续使用像素值,因为使用 dp 的全部好处似乎不存在。