我在7英寸平板电脑(800x480px)的dp计算方面遇到了一些问题。以下是我的计算方法。无法找到我在计算或我的想法中出错的地方:
我正在测试三种设备:
根据显示尺寸,我根据公式手动计算DPI(每英寸点数):
sqrt(w^2 + h^2) / in
所以我得到了:
现在我想输出屏幕指标的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);
结果如下:
我从我的活动中的java代码中获得的密度DPI与我计算的dpi值不同,并且显然由Android将其舍入到值120,160或240中的一个,这是很正常的。到目前为止没问题。
问题/问题1:
使用第三台设备,Novo 7“平板电脑: ScaledDensity据说是1.0,而 dp的宽度据说是800 ,与px的数量相同。然而,这不是现实;当我创建一个全屏应用并在那里放置一个视图时,只有533dp x 320dp的视图实际上适合屏幕。所以它与Nexus One的dp测量值相同;即使Nexus One具有更高的DPI值但像素数相同。怎么可能?
问题/问题2:
我为模拟器创建了一个AVD,其精确的测量结果为Novo 7“平板电脑。 我的java代码中的日志行显示的值与真正的平板电脑设备相同:
但是,在模拟器上,我可以放置一个 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的整个好处似乎都没有。
答案 0 :(得分:2)
唉,我只是忘记了这句话
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="11" />
在我的清单中。
没有android:minSdkVersion,总是出问题;我认为Android 1.5的遗留问题。