最近 Android 碰到一个适配问题,仔细研究了下 DPI 的问题,依然有些不解,望大佬解惑

2019-03-13 22:04:39 +08:00
 cxtrinityy
DPI 是个印刷术语,衍生到屏幕后应该叫 PPI,Pixel Per Inch,但是实际上我手头有两台华为 pad,同为 10.1 英寸,相同的分辨率 1920*1200,但是通过 DisplayMetrics.densityDpi 获取的 DPI 却并不相同,一台只有 240,另一台 8.0 系统的即使调整设置(Setting) - 显示(Display) - 显示模式( Display Size )为最小,也有 272 的 dpi,而且实际相同布局在两台 pad 上的确有比较大的差异
而根据 PPI 的公式,可以算出 dpi = 1920/(((10.1^2/(16^2+10^2))^0.5)*16)=224,这个值和 240 有点差距,可能有效计算区域稍有不同,但是和 272 差距就略大了
这就很奇怪了,就我所知,在物理尺寸不变的情况下,DPI 的变化必然会导致分辨率的变化,但实际上通过 DisplayMetrics.widthPixels 在两台 pad 上获取的值的确是 1920,而且 Display Size 的变化也会变更 dpi 的值,但不会改变分辨率,实在是想不明白,可见是我目前对 DPI、分辨率的了解存在部分缺失的认知,希望有大佬解答下
1677 次点击
所在节点    问与答
5 条回复
ysc3839
2019-03-13 22:09:56 +08:00
DisplayMetrics.densityDpi 是系统里设置的 DPI,不代表实际屏幕的 DPI。
cxtrinityy
2019-03-13 22:56:28 +08:00
@ysc3839 即使这样,也无法解释相同尺寸和分辨率的 pad 具有不同 dpi 这个问题,所以我好奇到底哪一环漏了
ysc3839
2019-03-13 23:10:33 +08:00
@cxtrinityy 系统里设置不同就不同了。
cxtrinityy
2019-03-13 23:32:54 +08:00
@ysc3839 但是单位 dp 对应到屏幕的物理大小的确在两台 pad 上是不一样的,同样的布局在两台 pad 上展示并不相同,那么这些设置对 dp 的计算会产生什么样的影响?考虑实际 dpi 本身就是为了适配,即使这些设置不代表实际 dpi,但确切的对适配上产生了影响
cxtrinityy
2019-03-14 10:11:27 +08:00
@ysc3839 我知道问题在哪了,DisplayMetrics.xdpi/ydpi 代表的是实际的物理 dpi,这个值两个 pad 返回的都是 224、225 左右,我的布局出现偏差问题在于我绘制布局的时候调用了 Resource.getDimensionPixelSize 这个方法来转换 dp,而这个转换方法是以 dp*DisplayMetrics.density , 这个 density 正是你说的系统设置的 densityDp 相对于基准 160 的缩放倍率
我只要用 xdpi 计算实际的 dpi 的缩放倍率来重新计算应该就可以解决我的问题了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/544318

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX