安卓中“最小宽度dp”引起的混淆

3

我正在学习如何使用“最小宽度dp”在安卓上支持不同的屏幕,参考这篇文章

我了解到以下数字是设备dp的最小边界。

屏幕宽度dp的典型数字为:

320:手机屏幕(240x320 ldpi、320x480 mdpi、480x800 hdpi等)。

480:Streak等介于手机和平板电脑之间的平板电脑(480x800 mdpi)。

600:7英寸平板电脑(600x1024)。

720:10英寸平板电脑(720x1280、800x1280等)。

根据这篇文章,Nexus 6具有730 x 410 dp的分辨率。

Nexus 6拥有令人印象深刻的5.96英寸Quad HD屏幕显示,分辨率为2560 x 1440(493 ppi)。这相当于约730 x 410个密度无关像素。

但正如这篇文章所解释的那样:

           dp = (px/dpi)*160
              = (1440/493)*160
              = ~467

那么为什么这会转化成730 x 410 dp呢? 此外,当我在Nexus 6上运行演示时,设备正在使用在res/values-sw320dp/dimens.xml中定义的填充维度。 这让我感到困惑。如何计算dp并相应地创建视图,使用“最小宽度dp”? 除了res/values-sw320dp之外,我还有res/value和res/values-sw600dp,它们下面都有dimens.xml。 更新:解决了我的困惑。请查看问题下面的评论。

1
请查看此链接(https://dev59.com/LnHYa4cB1Zd3GeqPICdY...),它可能会对您有所帮助。 - Biplab
我通过这个链接搞清楚了。dp 的计算是根据量化密度而不是物理密度。所以 Nexus 6 的 730 x 410 dp 是正确的。 - Ankit
1
而sw320dp部分的混淆是我理解上的错误。res/values-sw320dp被使用是因为下一个定义的桶是res/values-sw600dp,显然比410(Nexus 6的最小边)要大。 - Ankit
1个回答

7
您可以使用以下代码获得正确的值:
DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics();
    float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
    float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
    Log.d("dpHeight-----",String.valueOf(dpHeight));
    Log.d("dpWidth------",String.valueOf(dpWidth));

例如,对于分辨率为1080x1920像素的Xperia Z手机,其数值为360x592dp,设置为values-sw360dp

是的,这会给出正确的值。DisplayMetrics.density 用于缩放依赖于量化密度的资源。 - Ankit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接