【问题标题】:How to find what density bucket the phone is in?如何找到手机所在的密度桶?
【发布时间】:2015-03-30 03:50:59
【问题描述】:

有点菜鸟的问题,但在计算手机落入的密度桶时我感到困惑。我将以我的 Galaxy S3 为例。

它的分辨率为1280 x 720,这意味着它具有306 dpi。现在,参考下面的图表,我的手机属于hdpi 类别,因为它比240 dpi 多,但少于320 dpi 需要成为xhdpi 屏幕。所以,电话是853 x 480 DP(除以1.5)

但是,我手机上的屏幕信息应用程序告诉我这是xhdpi 屏幕。所以,电话是640 x 360 DP(除以2)。

我如何知道我的手机属于哪个正确的密度桶?

更新:
我正在尝试为我所在国家/地区排名前 10 位的 Android 手机设计我的应用程序。所以我正在计算它们在 DP 中的大小,以根据它们的“最小宽度 DP”来设计 UI。这不是一次性的大小计算。

【问题讨论】:

    标签: android screen dpi density-independent-pixel


    【解决方案1】:

    嘿,我认得这张图表!主要是因为我created it :D。为澄清起见,该图表显示了每个密度桶的基线 dpi,但不能用于确定设备应归类为哪个密度桶。也就是说,下图显示了设备是如何被概括为密度桶的,您可以看到它们的 dpi 可能高于或低于它们所在的桶。

    现在回答您的问题,遗憾的是,完全根据其规格,无法保证知道设备将落入什么密度桶。这是因为设备制造商能够选择密度桶。大多数时候,他们会选择最接近设备实际 dpi 的存储桶**。幸运的是,谷歌收集了一个list of common devices,以及它们在dp 中的屏幕尺寸和密度桶。这应该让您了解如何正确支持最流行的屏幕尺寸。

    **注意:有些设备有自己的特殊密度桶。最值得注意的是,Nexus 7 (2012) 是 213dpi (tvdpi),Nexus 5X 是 420dpi,Nexus 6 和 6P 是 560dpi。这些设备从其他密度版本中获取资源并对其进行扩展。

    【讨论】:

    • 厂家选择密度桶?我一直认为是 Android 运行时选择了存储桶
    • 制造商选择设备属于哪个设备存储桶,Android 运行时决定如何获取适当的资产(如果该密度不存在,它会创建它)。
    【解决方案2】:

    我认为 Android 试图找到“最佳匹配”。所以如果 306 在 240 和 320 之间,它更接近 320。所以它将使用 xhdpi。你可以阅读更多here。引用官方文档链接:

    根据当前屏幕的大小和密度,系统使用您的应用程序中提供的任何特定于大小和密度的资源。例如,如果设备具有高密度屏幕并且应用程序请求可绘制资源,则系统会查找与设备配置最匹配的可绘制资源目录。根据其他可用的替代资源,具有 hdpi 限定符的资源目录(例如 drawable-hdpi/)可能是最佳匹配,因此系统使用该目录中的可绘制资源。

    【讨论】:

    • 问题是询问如何确定设备属于哪个密度桶。这个 sn-p 解释了 Android 操作系统如何根据资产和设备屏幕密度决定获取哪个资产。此外,设备由制造商分类,没有“最佳”匹配,设备的密度桶是硬编码的。
    • 感谢您的评论史蒂文。这说得通。但是让我们说device's density bucket is hardcodedhdpi。如果不包含hdpi image/drawable 但图像包含在其他 dpi 文件夹中,会发生什么情况?它不像应用程序不会显示图像/drawable。是吗?在这种情况下,它将使用来自其他文件夹之一的“最佳匹配”drawable 并显示它。
    • 正确,Android 将使用 hdpi 资产,或者如果它不存在,它将通过扩展另一个版本来创建它。然而,最初的问题不是关于如何确定要使用哪个密度版本的资产。这是关于如何确定设备属于哪个密度桶。
    • 啊。我明白你现在的意思了。你说的对。这不应该是这个特定问题的公认答案。
    • 并没有真正回答问题,sn-p 也与问题完全无关。
    【解决方案3】:

    如果你想知道它一次,你可以得到一个类似ScreenInfo 的应用程序并运行它。如果想通过程序了解,可以添加密度文件夹,比如values-mdpivalues-xhdpi,在里面放一个xml文件,比如whoami.xml,内容如下:

    <resources>
        <string name="density_bucket">mdpi</string>
    </resources>
    

    分别:

    <resources>
        <string name="density_bucket">xhdpi</string>
    </resources>
    

    然后从应用中查询:

    String densityBucket = getResources().getString( R.string.density_bucket );
    

    【讨论】:

    • 我正在尝试为我所在国家/地区排名前 10 位的 Android 手机进行设计。我需要事先知道它们在 DP 中的大小,以便我可以设计适当的布局。你的回答没有帮助:)
    • 我回答了你提出的问题。你问错问题了吗?您的问题中没有任何地方说您正在请求对场外资源的推荐,这本来是题外话。
    • 如果我有点不清楚,我很抱歉。我更新了我的问题。 +1,因为我给您带来了一些不便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多