Android |为什么 activity 在分辨率和屏幕尺寸相同的两部不同手机上看起来不同?

Android | Why do activity look different on two different phones with same resolution as well as same screen size?

场景

我正在开发一个随机应用程序,最近我遇到了一个问题。我 运行 在 Google pixel 3a xl android 模拟器和 Asus X00TD 物理设备上使用相同的应用程序。我知道华硕 phone UI 真的变了。

Pixel 3a XL 显示器规格:

显示尺寸:6.0 英寸 分辨率:2160×1080 ppi : 402ppi

华硕 X00TD 显示器规格:

显示尺寸:6.0 英寸 分辨率:2160×1080 ppi : 403ppi

你看这几乎是一样的,只是 ppi 不同,我不认为这会产生很大的不同。大约 6 个像素将受到影响,并且不会改变整个 UI。我不知道 asus x00td 的 dpi 分辨率。我在网上也找不到。

这是像素 3a xl 和华硕 x00td 之间的 UI 差异。

如您所见,模拟器和物理机之间存在很大差异 phone。所以,我有 2 个问题

  1. 有一种方法可以通过函数计算dpi。但是,如果我没有 phone 并且仍然想知道那个 phone 的 dpi res 怎么办?

  2. 为什么模拟器和实体机差别这么大phone?

编辑

我试图在互联网上计算它,但它给了我 0.0631mm 点距。我无法理解它是什么。模拟器还显示像素 3a xl 具有 400dpi 分辨率。

那么,400dpi0.0631mm dot pitch有什么区别?

我试过的解决方案

我试图通过将最小宽度设置为 360dp 来在模拟器中模拟华硕设备。最初它看起来和华硕一样。模拟器正在选择 dimens.xmlxhdpi 文件。因此,我对 xhdpidimens.xml 进行了更改,但是华硕没有选择该文件。相反,它选择了 xxhdpi 文件。在另一台设备 Realme 3 pro 中使用。我无法修改 xxhdpi 文件,因为它会弄乱 UI 所有 6 英寸以上的显示器 phone。同时,华硕仍在挑选 xxhdpi 文件,华硕的 UI 被搞砸了。

找不到解决办法。

这些差异是由制造商为这些设备设置的不同密度桶造成的。来自 doc:

xhdpi Resources for extra-high-density (xhdpi) screens (~320dpi).

xxhdpi Resources for extra-extra-high-density (xxhdpi) screens (~480dpi).

请注意,您处于这些值的中间位置。看起来华硕决定将自己的 Android 配置为 xxhdpi,因此界面可以扩展到更大的 UI 元素(也使用更大的图像),而 Google 设置 xhdpi 使用更小的 UI 元素和图标

使自己的界面“更易于打包”的限定词

在密度限定符下,您可以保留例如dimen,因此边距的大小或某些线条或边框的粗细。特别是当您使用系统内置的带有 @android/android.R 前缀的许多资源时——这些资源通常根据存储桶高度参数化,例如厚列表项分隔符在 ldpi 设备上可能具有 0 高度值,用于将其隐藏,从而在此类 small/poor 屏幕上留下更多 space 内容。也有不同的 images/drawables 用于绘制。在右上角的图标上放一个红点,但只在 xxhdpi 文件夹中,您会看到只有一台设备会得到此更改

在开发者设置中还有一个选项可以操纵“最大宽度”,在那里你可以“改变密度”并且可以尝试整个系统和应用程序的界面如何变化。当 Pixel 设置为至少 400 时,华硕的投注设置为 ~360(四舍五入到 xx 桶,接近 480)

如上文 snachmsm 所述,布局限定符最有助于实现显示响应。

在我的例子中,华硕 x00td 没有正确显示内容。所以,要解决这个问题,

我使用了 height 限定符值 height,这导致了最小高度。因此,高度为 600dp 或以上的设备将使用 dimens.xml(h600dp)。所以,华硕拿起了这个文件。我还为 700dp 创建了文件,它的尺寸稍大一些,适合像 realme 3 pro 这样的大型显示器。

此外,我使用约束布局指南百分比来重新排列视图,以便自动调整边距。

因此,尺寸和大小由 dimens.xml 控制,边距由约束布局自动控制。