我问的原因是因为我创建了以下值目录资源。 (...)
在 dimens.xml 中,我有不同的边距,并根据存储桶大小设置 dp。 (...)
我很想知道这是否是正确的方法。
我不确定为什么你想要指定不同的边距dp
取决于密度。将边距指定为dp
对于基线密度,已经为您处理了所有其他密度,这意味着边距的物理尺寸在任何设备上显示时都将是相同的。
如果你用过px
代替dp
(但不要),那么您就必须自己针对不同的屏幕进行缩放。
缩小到桶中,即如果 ppi 为 300,那么会进入 hdpi 桶,因为它小于 320?
是的,但不是因为它小于 320。如果有经验法则,我会说它四舍五入到最接近的广义密度。请参阅 Android 如何将实际密度大致映射到广义密度的图示(该图并不准确):
相关部分文档 http://developer.android.com/guide/practices/screens_support.html#range这是:
每个广义尺寸和密度都涵盖了一系列实际屏幕尺寸和密度。例如,两个设备的屏幕尺寸均报告为normal手工测量时的实际屏幕尺寸和纵横比可能略有不同。同样,报告屏幕密度为的两台设备hdpi实际像素密度可能略有不同。 Android 将这些差异抽象到应用程序中,因此您可以提供针对通用尺寸和密度设计的 UI,并让系统根据需要处理任何最终调整。
再说一次,你不应该真正关心how如果你只是编写一个应用程序,Android 就会这样做。你应该关心的是:
- 指定全部布局尺寸 http://developer.android.com/guide/topics/ui/declaring-layout.html#layout-params值在
dp
或与wrap_content
/match_parent
,视情况而定(文本可以在sp
额外匹配用户偏好,但除了文本之外什么都没有),
- 考虑不同的布局物理尺寸 http://developer.android.com/guide/topics/resources/providing-resources.html#SmallestScreenWidthQualifier and 方向 http://developer.android.com/guide/topics/resources/providing-resources.html#OrientationQualifier屏幕的
- 为不同的对象提供位图资源密度 http://developer.android.com/guide/topics/resources/providing-resources.html#DensityQualifier,只是为了避免模糊或像素化伪影(因为如果您使用 Android 会将它们缩放到正确的物理尺寸
dp
or wrap_content
).
安卓会查找最匹配的资源 http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch, and 然后透明处理 http://developer.android.com/guide/practices/screens_support.html#terms的任何缩放dp
单位,根据需要,基于使用中屏幕的实际密度。的转换dp
屏幕像素的单位很简单:px = dp * (dpi / 160)
.
注意actual密度相对于广义的密度。后者只是为开发人员提供了便利,因为不可能为每个屏幕提供可绘制对象。这样,开发人员只需提供 3 或 4 组图形,而 Android 会选择最接近的图形,并根据特定设备的需求进一步调整。 (现在可以使用一个矢量绘图而不是许多预先缩放的光栅图形,这意味着更好的质量和更小的尺寸。)
这是计算屏幕尺寸桶的正确方法吗?
不它不是。根据Google 设备指标 https://design.google.com/devices/您列出的所有设备都属于高于您预期的类别:
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 具有更高的物理密度,但距离 640px/in 仍相去甚远。安卓一号是hdpi
但它仅比 Nexus 7 '12 稍微密集一点tvdpi
。 Chromebox 30 和 Chromebook Pixel(诚然,不是 Android)已分配到存储桶mdpi
and xhdpi
即使他们的身体素质低于ldpi
and hdpi
, 分别。