Android应用程序按18个维度的资源限定符来组织应用程序资源,如下表所示
上表是一个优先级列表,优先级从高到底
资源匹配算法
为方便理解,以我们日常接触较多的drawable目录为例,假设手机设备配置如下:
语言区域:中国
屏幕像素密度(DPI):xdpi
屏幕方向:竖屏
1.排除与设备配置冲突的资源文件
由于手机语言设置为中文,所以
2.从优先级列表中选定(下一个)资源限定符
根据上面的优先级列表首先为选这MCC和MNC作为限定符,然后下移
3.判断当前所有资源目录是否含有此限定符
如果当前资源目录含有此限定符,则执行第四步,反之则执行第二步,从优先级列表中选择下一个资源限定符。
4.排除与资源限定符不匹配的资源目录
排除不含此限定符的资源目录
注意:如果涉及的限定符是屏幕像素密度,则 Android 会选择最接近设备屏幕密度的选项。通常,Android 倾向于缩小大型原始图像,而不是放大小型原始图像。
通用密度 | 范围值 |
---|---|
ldpi(低) | ~120dpi |
mdpi(中) | ~160dpi |
hdpi(高) | ~240dpi |
xhdpi(超高) | ~320dpi |
xxhdpi(超超高) | ~480dpi |
xxxhdpi(超超超高) | ~640dpi |
个人理解,如果设备的实际DPI位于ldpi与mdpi交集段的中心,那么系统会倾向于使用mdpi目录下的资源,即缩小大图,缩小清晰度能得到保障,放大容易模糊。
5.排除与当前资源限定符不符合的资源目录后,如果剩余的匹配目录不唯一,则重复执行第2、3、4步,直到匹配的资源目录唯一。
drawable-nxhdpi-2150x1080 dpi后面可以跟具体的分辨率,代码中nxhdpi看不懂,可解压apk,会发现对应440dpi-2150x1080
参考链接:
https://developer.android.com/guide/topics/manifest/activity-element.html?hl=zh-cn#config
https://developer.android.com/guide/practices/screens_support.html
https://developer.android.com/guide/topics/resources/providing-resources.html
anddroid:configChange