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

如何解决安卓 |为什么 Activity 在分辨率和屏幕尺寸相同的两部不同手机上看起来不同?

场景

我正在开发一个随机应用程序,最近我遇到了一个问题。我在 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 差异。

6.0 inch mobile comparision

如您所见,模拟器和实体手机之间存在很大差异。所以,我有两个问题

  1. 有一种方法可以按函数计算 dpi。但是,如果我没有手机但仍想知道该手机的 dpi 分辨率怎么办?

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

编辑

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

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

我尝试过的解决方

我试图通过将最小宽度设置为 360dp 来模拟模拟器中的 asus 设备。最初它看起来和华硕一样。并且模拟器正在选择 xhdpidimens.xml 文件。因此,我对 dimens.xmlxhdpi 进行了更改,但是华硕没有选择该文件。相反,它选择了 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 没有正确显示内容。所以,要解决这个问题,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?