【问题标题】:Using nnndpi for Android layout folders将 nnndpi 用于 Android 布局文件夹
【发布时间】:2018-10-30 10:59:14
【问题描述】:

在多年使用特定于像素的 Android 布局之后,我遇到了“nnndpi”限定符。我无法专门针对三星 Galaxy S8 将其与从 sw360dp-xxxhdpi 文件夹中提取的其他设备分开。 sw360dp-xxxhdpi 还针对 S7,因此这两个设备在 xml 文件中定义 marginLeft 时实际上将某些屏幕元素显示为大约 60dp。

我尝试定义 h740dp 和 h740dp-xxxhdpi、568dpi、142dpi 以及我从这个出色的设备规范资源中得出的一些其他变体:https://material.io/tools/devices

我无法以 S8 为目标,我认为必须有一种方法可以针对这个特定设备和市场上的任何其他设备(不管这是否是一种糟糕的设计实践)。

【问题讨论】:

  • 您不应该针对特定设备进行布局。这些分类使布局适用于一般设备规格。您应该为尺寸使用dp 值,而不是`px。
  • @TheWanderer 我知道这不是我在问题中所说的最佳设计实践,只是想知道如何使用 nnndpi 限定符,因为它是由 Google 提供给我们的

标签: java android android-studio


【解决方案1】:

三星 Galaxy S8 屏幕在 xxxhdpi 时为 360dp x 740dp。可用于定位此屏幕的资源限定符是:

  • sw360dp(最小宽度)- S8 将始终匹配此
  • w360dp(可用宽度)-无论方向如何,S8 都将匹配此(因为横向宽度将超过 360dp)
  • h740dp(可用高度)- S8 将在纵向上匹配此(尽管不完全一致;请参阅下文)
  • xxxhdpi(像素密度)- S8 将始终匹配此

h740dp 限定符的问题是“可用宽度/高度”限定符没有给出物理屏幕尺寸;他们减去状态栏和导航栏等持久 UI。状态栏通常为 24dp,导航栏更大(通常为 48dp 或更大),但这些都不能保证(如果您使用 fitsSystemWindows 或以其他方式隐藏这些栏,则可以获得不同的结果)。

最重要的是,您根据屏幕尺寸所做的任何“定位”都将始终有可能定位到其他设备,因为没有什么能阻止 LG 制造具有至少 360x740dp 的 xxxhdpi 屏幕的手机。

在一起,这意味着你不应该做你正在做的事情。但是如果你必须这样做,那么我会尝试这组限定符:layout-sw360dp-h668dp-xxxhdpi 用于纵向(您可以尝试使用确切的数字用于hXXXdp 以说明状态和导航栏)和layout-sw360dp-w740dp-xxxhdpi 用于横向.

【讨论】:

  • 多么棒的答案……祝你好运,除了这里之外,还能在网络上找到布局文件夹语法!我确实尝试过 layout-h740dp-land-xxxhdpi.. 现在试试这个
  • 经过一些测试,layout-sw360dp-w668dp-xxxhdpi 工作!我认为至少其中一个是错误的,因为您在答案中写了 layout-sw360dp-h668dp-xxxhdpi 。有人会认为名称中的 sw 和 w 会抵消或导致错误...非常酷的回答我的朋友。 . 改变一切以针对特定设备
  • @Eir 假设密度为 3.5,则 1440x2880 屏幕将为 411x822 dp。所以你可以试试layout-sw411dp-h750-xxxhdpi。最小宽度是 411,因为它始终是 411dp 宽(至少),可用高度是 750,因为状态栏是 822 减 24,导航栏是 822 减 48。
  • 我提到的密度值是用实际像素密度除以160得到的。如果你屏幕的ppi是564,那么564/160 = 3.525。然后,您可以通过将像素尺寸除以该值来计算 dp 尺寸,因此 1440/3.525=408.51(可能四舍五入为 408 或 409dp)。 然而,设备的真实像素密度(对你来说是 564)通常不是 Android 使用它的数学...得到@ 987654337@ 实例并检查 density 列出的内容。 这是 Android 用于其数学运算的实数。
  • 所以,dpi值为640,宽度为1440px,高度为2672px640/160 = 4,所以宽度为1440px / 4 = 360dp,高度为668dp。总之,这会给你layout-sw360dp-h668dp-xxxhdpi...但是你所拥有的也应该工作,所以我有点难过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2014-07-01
  • 2016-03-30
  • 2022-01-05
相关资源
最近更新 更多