V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cxtrinityy
V2EX  ›  问与答

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

  •  
  •   cxtrinityy · 2019-03-13 22:04:39 +08:00 · 1663 次点击
    这是一个创建于 2080 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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、分辨率的了解存在部分缺失的认知,希望有大佬解答下
    5 条回复    2019-03-14 10:11:27 +08:00
    ysc3839
        1
    ysc3839  
       2019-03-13 22:09:56 +08:00
    DisplayMetrics.densityDpi 是系统里设置的 DPI,不代表实际屏幕的 DPI。
    cxtrinityy
        2
    cxtrinityy  
    OP
       2019-03-13 22:56:28 +08:00
    @ysc3839 即使这样,也无法解释相同尺寸和分辨率的 pad 具有不同 dpi 这个问题,所以我好奇到底哪一环漏了
    ysc3839
        3
    ysc3839  
       2019-03-13 23:10:33 +08:00
    @cxtrinityy 系统里设置不同就不同了。
    cxtrinityy
        4
    cxtrinityy  
    OP
       2019-03-13 23:32:54 +08:00
    @ysc3839 但是单位 dp 对应到屏幕的物理大小的确在两台 pad 上是不一样的,同样的布局在两台 pad 上展示并不相同,那么这些设置对 dp 的计算会产生什么样的影响?考虑实际 dpi 本身就是为了适配,即使这些设置不代表实际 dpi,但确切的对适配上产生了影响
    cxtrinityy
        5
    cxtrinityy  
    OP
       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 的缩放倍率来重新计算应该就可以解决我的问题了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   975 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:58 · PVG 04:58 · LAX 12:58 · JFK 15:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.