屏幕密度DPI
单位尺寸(英寸)内像素点的个数称为屏幕密度(DPI),通常水平和垂直的DPI是近乎相等或者极其接近的。
比如一款MacBook Pro,13.3x8.3英寸屏,最大分辨率2560x1600,那它的水平、垂直DPI到达了192,因为2560/13.3=192.48,1600/8.3=192.77。
获取手机DPI
- 命令行获取
adb shell wm density Physical density: 225
- 代码获取
float xdpi = getResources().getDisplayMetrics().xdpi; float ydpi = getResources().getDisplayMetrics().ydpi;
屏幕密度和图片文件夹对应规则
密度区间 | ldpi | mdpi | hdpi | xhdpi | xxhdpi | xxxhdpi |
---|---|---|---|---|---|---|
dpi | 120 | 160 | 240 | 320 | 480 | 640 |
1dp对应像素数 | 0.75 | 1.0 | 1.5 | 2.0 | 3.0 | 4.0 |
比如设备dpi为160时,就会优先从mdpi文件夹选取图片;如果选取不到,再从其他文件夹选取并进行缩放操作。
当手机不是标准dpi时,选取图片的规则
dpi范围 | 密度 |
---|---|
0dpi ~ 120dpi | ldpi |
120dpi ~ 160dpi | mdpi |
160dpi ~ 240dpi | hdpi |
240dpi ~ 320dpi | xhdpi |
320dpi ~ 480dpi | xxhdpi |
480dpi ~ 640dpi | xxxhdpi |
图片选取后大小计算
手机显示像素 = 图片实际像素尺寸 × 机型DPI / 所在资源目录DPI
比如,一张100x100的图片放在xhdpi下,当前手机dpi为225:
- 首先,225dpi落在hdpi范围内,hdpi文件夹下没有对应文件,尝试从其他分辨率文件夹查找
- xdpi找到文件,系统对图片进行缩放,缩放后宽度和高度都是100*225/320 = 70.31,四舍五入为70
图片放置规则
可以看出,图片放在机型对应dpi文件夹下最好,这样缩放操作会变少甚至没有缩放。
如果一张宽高较小的图片放置在高分辨率文件夹下,而显示的ImageView写成设计图上的固定尺寸的话,就会导致系统获取的图片像素被缩小,又因为ImageView尺寸较大被拉伸,造成失真。
实际项目碰到一个类似问题,一张图片放在xhdpi下,设备为hdpi机型,系统获取的图片被缩小,但是ImageView写成了蓝湖上的固定尺寸,导致图片失真。
参考资料
文档信息
- 本文作者:itlgl
- 本文链接:https://itlgl.com/note/2021/06/01/issues-50/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)