我之所以问这个问题是因为我创建了以下价值目录资源。(...)在dimens.xml中,我有不同的边距,并根据桶大小设置dp。(...)我想知道这是否是正确的方法。
我不确定为什么要根据密度指定不同的dp边距。一次将边距指定为dp,适用于基线密度,已经为您处理了所有其他密度,这意味着当在任何设备上显示时,边距的物理大小都将相同。
如果您使用px而不是dp(但不要这样做),则必须为不同的屏幕自行进行缩放。
缩小到桶内,即如果ppi为300,则会进入hdpi桶,因为它小于320吗?
是的,但不是因为它小于320。如果有一个经验法则,我会说它是四舍五入到最近的广义密度。请参见Android大致将实际密度映射到广义密度的示例(图不精确):
文档的相关部分如下:
每个通用尺寸和密度都涵盖了一定范围的实际屏幕尺寸和密度。例如,报告为normal屏幕尺寸的两个设备,在手动测量时可能具有略微不同的实际屏幕尺寸和宽高比。同样,报告为hdpi屏幕密度的两个设备可能具有略微不同的实际像素密度。Android将这些差异抽象成应用程序可以使用的通用尺寸和密度,让系统根据需要进行任何最终调整。
因此,如果你只是开发一个应用程序,你不需要真正关心Android是如何做到这一点的。你需要关心的是:
- 请将所有布局尺寸的值用
dp
或适当使用wrap_content
/match_parent
指定(文本可以使用sp
以便与用户偏好匹配,但不能使用除文本以外的内容),
- 考虑不同的布局,根据屏幕的物理尺寸和方向而定,
- 提供位图资源,以适应不同的密度,以避免模糊或像素化的伪影(因为如果您使用
dp
或wrap_content
,Android会对它们进行缩放以获得正确的物理大小)。
Android将会查找最佳匹配资源, 并根据实际使用的屏幕密度,透明地处理dp
单位的任何缩放。将dp
单位转换为屏幕像素非常简单:px = dp * (dpi / 160)
。
请注意实际密度而不是一般化的密度。后者仅供开发人员方便使用,因为不可能为每个屏幕提供可绘制对象。这样开发人员只需要提供3或4组图形,而Android会选择最接近的匹配并进一步调整以适应该特定设备的需求。(现在可以使用一个矢量可绘制对象代替许多预缩放光栅图形,这意味着更好的质量和更小的尺寸。)
这是计算屏幕尺寸桶的正确方法吗?
不是的。根据
Google设备指标,你列出的所有设备都属于比你预期更高的桶位。
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。Android One是“hdpi”,但它只比Nexus 7 '12略密,后者是“tvdpi”。Chromebox 30和Chromebook Pixel(尽管不是Android)分配到“mdpi”和“xhdpi”桶中,即使它们在物理上低于“ldpi”和“hdpi”,分别是如此。
getResources().getDisplayMetrics().density;
我正在使用 Xamarin C# 进行测试,其中名称已转换为 .Net 标准。 - ToolmakerSteveDisplayMetrics.densityDpi
,这似乎遵循了DisplayMetrics.density * 160
公式。我对我引用的文档过于深入地阅读了。当前文档只是说:“系统根据屏幕dpi选择适当的位图。如果您没有为该密度提供特定于密度的资源,则系统会选择下一个最佳匹配项并将其缩放以适合屏幕”。 - arekolek