问题描述
场景
我正在开发一个随机应用程序,最近我遇到了一个问题。我在 Google pixel 3a xl android 模拟器和 Asus X00TD 物理设备上运行相同的应用程序。我知道华硕手机用户界面真的发生了变化。
Pixel 3a XL 显示规格:
显示尺寸:6.0 英寸 分辨率:2160 × 1080 ppi:402ppi
华硕 X00TD 显示规格:
显示尺寸:6.0 英寸 分辨率:2160 × 1080 ppi:403ppi
你看它几乎相同,只是 ppi 不同,我认为这不会产生很大的不同。大约 6 个像素会受到影响,这不会改变整个 UI。我不知道 asus x00td 的 dpi
分辨率。而且我在网上也找不到。
这是像素 3a xl 和 asus x00td 之间的 UI 差异。
如您所见,模拟器和实体手机之间存在很大差异。所以,我有两个问题
编辑
我试图在互联网上计算它,但它给了我 0.0631mm
点距。我无法理解它是什么。模拟器还显示像素 3a xl 具有 400dpi
分辨率。
那么,400dpi
和 0.0631mm dot pitch
之间有什么区别?
我尝试过的解决方案
我试图通过将最小宽度设置为 360dp 来模拟模拟器中的 asus 设备。最初它看起来和华硕一样。并且模拟器正在选择 xhdpi
的 dimens.xml
文件。因此,我对 dimens.xml
的 xhdpi
进行了更改,但是华硕没有选择该文件。相反,它选择了 xxhdpi
文件。用于另一台设备 Realme 3 pro。我无法修改 xxhdpi
文件,因为它会弄乱所有 6 英寸以上显示屏手机的用户界面。同时 asus 仍在选择 xxhdpi
文件,而 asus 的 UI 一团糟。
找不到解决方案。
解决方法
这些差异是由制造商为这些设备设置的不同密度桶造成的。来自doc:
xhdpi 用于超高密度 (xhdpi) 屏幕 (~320dpi) 的资源。
xxhdpi 用于超高密度 (xxhdpi) 屏幕 (~480dpi) 的资源。
请注意,您处于这些值的中间位置。看起来 Asus 决定将自己的 Android 配置为 xxhdpi
,因此界面可以扩展到更大的 UI 元素(也使用更大的图像),而 Google 设置了 xhdpi
限定符,使自己的界面“更易于打包”并具有更小的 UI元素和图标
在密度限定符下,您可以保留例如dimen
,所以一些线条或边框的边距或厚度的大小。特别是当您使用系统内置的带有 @android
/android.R
前缀的许多资源时 - 这些资源通常根据存储桶进行高度参数化,例如厚列表项分隔符在 0
设备上可能具有 ldpi
高度值,用于将其隐藏起来,在如此小/差的屏幕上为内容留出更多空间。还使用不同的图像/可绘制对象进行绘制。在右上角的图标上放置一个红点,但仅在 xxhdpi
文件夹中,您将看到只有一台设备会获得此更改
在开发者设置中还有一个选项用于操作“最大宽度”,在那里你可以“改变密度”并可以尝试整个系统和应用程序的界面如何改变。当 Pixel 设置为至少 400 时,Asus 的赌注设置为 ~360(四舍五入到 xx 桶,接近 480)
,正如 snachmsm upper 所解释的,布局限定符对实现显示响应最有帮助。
就我而言,是 asus x00td 没有正确显示内容。所以,要解决这个问题,
我使用了 height
的 height
限定符值,这导致了最小高度。因此,高度为 600dp
或更高的设备将使用 dimens.xml(h600dp)
。所以,华硕拿起了这个文件。以及我为 700dp
创建的文件,对于像 realme 3 pro 这样的大型显示器,它的尺寸略大。
另外,我使用约束布局指南百分比以自动调整边距的方式重新排列视图。
因此,尺寸和大小由 dimens.xml 控制,边距由约束布局自动控制。