我问的原因是因为我创建了以下值目录资源。 (...)
在 dimens.xml 中,我有不同的边距,并根据存储桶大小设置 dp。 (...)
我很想知道这是否是正确的方法。
我不确定为什么要根据密度在dp 中指定不同的边距。将边距指定为dp 一次,对于基线密度,已经为您处理了所有其他密度,这意味着在任何设备上显示时,边距的物理尺寸都将相同。
如果您使用px 而不是dp(但不要),那么您必须自己为不同的屏幕进行缩放。
缩小到存储桶中,即如果 ppi 为 300 会进入 hdpi 存储桶,因为它小于 320?
是的,但不是因为它小于 320。如果有经验法则,我会说它是四舍五入到最接近的广义密度。请参阅此图,了解 Android 如何将实际密度大致映射到广义密度(数字不准确):
the documentation 的相关部分是这样的:
每个通用尺寸和密度都涵盖一系列实际屏幕尺寸和密度。例如,两台设备都报告屏幕尺寸正常,实际屏幕尺寸和纵横比可能会在手动测量时略有不同。同样,报告屏幕密度为 hdpi 的两个设备的实际像素密度可能略有不同。 Android 将这些差异抽象为应用程序,因此您可以提供为通用尺寸和密度设计的 UI,并让系统根据需要处理任何最终调整。
同样,如果您只是在编写应用程序,那么您不应该真正关心Android 是如何做到这一点的。你应该关心的是:
Android 将根据使用中屏幕的实际密度,根据需要对lookup the best matching resource 和then transparently handle 任何dp 单位进行缩放。 dp 单位到屏幕像素的转换很简单:px = dp * (dpi / 160)。
注意 actual 密度与 generalized 密度相对。后者只是方便开发人员,因为不可能为每个屏幕提供可绘制对象。这样,开发人员只需要提供 3 或 4 组图形,而 Android 会选择最合适的并根据特定设备的需要进行进一步调整。 (现在可以使用一个可绘制的矢量而不是许多预先缩放的光栅图形,这意味着更好的质量和更小的尺寸。)
这是计算屏幕尺寸的正确方法吗?
不,不是。根据Google device metrics,您列出的所有设备都比您预期的高:
Galaxy S3 NA NA
Nexus 4 318 xhdpi
Nexus 5X 424 xxhdpi
Nexus 5 445 xxhdpi
Nexus 6 493 xxxhdpi
Nexus 6P 515 xxxhdpi
我从该列表中取出了一些其他设备,并绘制了不同设备如何根据其实际物理密度落入密度桶的情况。
Chromebox 30 101 mdpi
Chromebook 11 135 mdpi
Samsung Galaxy Tab 10 149 mdpi
Nexus 7 '12 216 tvdpi
Android One 218 hdpi
Chromebook Pixel 239 xhdpi
Nexus 9 288 xhdpi
Nexus 10 299 xhdpi
Moto X 312 xhdpi
Nexus 4 318 xhdpi
Nexus 7 '13 323 xhdpi
Moto G 326 xhdpi
Dell Venue 8 359 xhdpi
LG G2 424 xxhdpi
Nexus 5X 424 xxhdpi
HTC One M8 441 xxhdpi
Nexus 5 445 xxhdpi
Nexus 6 493 xxxhdpi
Nexus 6P 515 xxxhdpi
LG G3 534 xxhdpi
您可以看到,除了一些值得注意的例外,选择最接近的广义密度的规则仍然成立。
Nexus 6 和 6P 除外,它们被列为xxxhdpi,尽管 LG G3 具有更高的物理密度并且距离 640 像素/英寸还很远。 Android One 是 hdpi,但它只比 Nexus 7 '12(tvdpi)稍微密集一些。 Chromebox 30 和 Chromebook Pixel(诚然,不是 Android)被分配到存储桶 mdpi 和 xhdpi,即使它们在物理上分别低于 ldpi 和 hdpi。