Android不同分辨率图片实际显示大小的计算

2021/06/01 note 共 1047 字,约 3 分钟

屏幕密度DPI

单位尺寸(英寸)内像素点的个数称为屏幕密度(DPI),通常水平和垂直的DPI是近乎相等或者极其接近的。
比如一款MacBook Pro,13.3x8.3英寸屏,最大分辨率2560x1600,那它的水平、垂直DPI到达了192,因为2560/13.3=192.48,1600/8.3=192.77。

获取手机DPI

  1. 命令行获取
    adb shell wm density  
    Physical density: 225  
    
  2. 代码获取
    float xdpi = getResources().getDisplayMetrics().xdpi;  
    float ydpi = getResources().getDisplayMetrics().ydpi;  
    

屏幕密度和图片文件夹对应规则

密度区间ldpimdpihdpixhdpixxhdpixxxhdpi
dpi120160240320480640
1dp对应像素数0.751.01.52.03.04.0

比如设备dpi为160时,就会优先从mdpi文件夹选取图片;如果选取不到,再从其他文件夹选取并进行缩放操作。

当手机不是标准dpi时,选取图片的规则

dpi范围密度
0dpi ~ 120dpildpi
120dpi ~ 160dpimdpi
160dpi ~ 240dpihdpi
240dpi ~ 320dpixhdpi
320dpi ~ 480dpixxhdpi
480dpi ~ 640dpixxxhdpi

图片选取后大小计算

手机显示像素 = 图片实际像素尺寸 × 机型DPI / 所在资源目录DPI

比如,一张100x100的图片放在xhdpi下,当前手机dpi为225:

  1. 首先,225dpi落在hdpi范围内,hdpi文件夹下没有对应文件,尝试从其他分辨率文件夹查找
  2. xdpi找到文件,系统对图片进行缩放,缩放后宽度和高度都是100*225/320 = 70.31,四舍五入为70

图片放置规则

可以看出,图片放在机型对应dpi文件夹下最好,这样缩放操作会变少甚至没有缩放。
如果一张宽高较小的图片放置在高分辨率文件夹下,而显示的ImageView写成设计图上的固定尺寸的话,就会导致系统获取的图片像素被缩小,又因为ImageView尺寸较大被拉伸,造成失真。
实际项目碰到一个类似问题,一张图片放在xhdpi下,设备为hdpi机型,系统获取的图片被缩小,但是ImageView写成了蓝湖上的固定尺寸,导致图片失真。

参考资料

文档信息

Search

    Table of Contents