一、Android 资源匹配原则
在运行时,Android系统会根据当前的设备设置自动寻找合适的资源。为不同的设备提供不同的资源,主要是利用特殊命名的资源文件夹来实现的。
二、资源文件命名
1. Android工程res目录下资源文件的命名格式:
资源名-属性1-属性2-属性3-属性4
资源名的取值有:drawable, values, layout, anim, raw, menu, color, animator等
各属性的位置顺序必须遵守优先级从高到低排列,否则编译不过。以资源文件values为例,各属性按优先级从高到低的排序为:
values-mcc310-en-sw320dp-w720dp-h720dp-large-long-port-car-night-ldpi-notouch-keysexposed-nokeys-navexp osed-nonav-v7
2、属性说明:
values-mcc310(sim卡运营商)-en(语言)-sw320dp(屏幕最小宽度)-w720dp(屏幕最佳宽度)-h720dp(屏幕最佳高度)-la rge(屏幕尺寸)-long(屏幕长短边模式)-port(当前屏幕横竖屏显示模式)-car(dock模式)-night(白天或夜晚)-ldpi(屏幕最佳dpi)-notouch(触摸屏模类型)-keysexposed(键盘类型)-nokey(硬按键类型)-navexposed(方向键是否可用)-nonav (方向键类型)-v7(android版本)
三、资源文件匹配
- 匹配是从最高优先级别的属性开始,排除跟系统配置不同的资源文件,而不是优先选择匹配到的属性数量最多的资源文件,例如:系统配置为values-en-normal-hdpi的手机,values-en匹配比vaues-normal-hdpi更合适。
- 对于属性是屏幕大小 (screen size),系统的匹配规则是"向下最佳匹配",即如果找不到能跟当前屏幕匹配的资源,比当前更小的屏幕的资源就会被使用(比如,一个large-size屏幕将会在必要的时候使用normal-size屏幕的资源文件) 如果唯一可选的资源比当前的屏幕大,系统不会使用它们并且你的程序会崩溃。
- 如果属性是屏幕像素密度dpi (device screen density),Android会选择最接近屏幕像素密度的一个,匹配规则如下图,可根据后面的测试结果对比。(Android比较偏向于将原始的大图片缩放成小的图片)。
- 如果属性是分辨率 (如 480×800 ),向下读取与它最为接近的适配文件(即使向上会找到更为接近的,也取向下找到的结果)。
- 多属性混合时,匹配的信息越详细,优先级越高. 假设现有一台手机的分辨率为 1080×1920 (xxhdpi),应用程序包含资源文件:
values,values-1080×1920,values-xxhdpi,values-xxhdpi-768x1280,values-hdpi-480x80 0,values-xxhdpi-1080x1920.
读取时这些资源文件的优先级为:
values-xxhdpi-1080x1920 > values-xxhdpi-768 x1280> values-xxhdpi > values-hdpi-480x800, values-1080x1920 > values
符合向下读取最接近的分辨率,并且其提供的信息相对于values-xxhdpi更加详细
参考链接:Android中values文件的使用 android values匹配规则_mob6454cc745a10的技术博客_51CTO博客