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 个问题
有一种方法可以通过函数计算dpi。但是,如果我没有 phone 并且仍然想知道那个 phone 的 dpi res 怎么办?
为什么模拟器和实体机差别这么大phone?
编辑
我试图在互联网上计算它,但它给了我 0.0631mm
点距。我无法理解它是什么。模拟器还显示像素 3a xl 具有 400dpi
分辨率。
那么,400dpi
和0.0631mm dot pitch
有什么区别?
我试过的解决方案
我试图通过将最小宽度设置为 360dp 来在模拟器中模拟华硕设备。最初它看起来和华硕一样。模拟器正在选择 dimens.xml
的 xhdpi
文件。因此,我对 xhdpi
的 dimens.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 控制,边距由约束布局自动控制。
场景
我正在开发一个随机应用程序,最近我遇到了一个问题。我 运行 在 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 个问题
有一种方法可以通过函数计算dpi。但是,如果我没有 phone 并且仍然想知道那个 phone 的 dpi res 怎么办?
为什么模拟器和实体机差别这么大phone?
编辑
我试图在互联网上计算它,但它给了我 0.0631mm
点距。我无法理解它是什么。模拟器还显示像素 3a xl 具有 400dpi
分辨率。
那么,400dpi
和0.0631mm dot pitch
有什么区别?
我试过的解决方案
我试图通过将最小宽度设置为 360dp 来在模拟器中模拟华硕设备。最初它看起来和华硕一样。模拟器正在选择 dimens.xml
的 xhdpi
文件。因此,我对 xhdpi
的 dimens.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 控制,边距由约束布局自动控制。