应用在运行是,在运行时,Android系统会根据当前的设备设置自动寻找合适的资源。为不同的设备提供不同的资源,主要是利用特殊命名的资源文件夹来实现的。
一、资源文件命名
对于一个资源文件,针对设备的不同,需要提供一整套的资源文件供程序运行时根据设备和运行条件(横屏或者竖屏、移动还是联通)的不同来选择合适的资源文件。资源文件必须名称相同地放置到合适的资源文件夹下面,而资源文件夹的命名至关重要。
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-navexposed-nonav-v7;
属性说明:
values-mcc310(sim卡运营商)-en(语言)-sw320dp(屏幕最小宽度)-w720dp(屏幕最佳宽度)-h720dp(屏幕最佳高度)-large(屏幕尺寸)-long(屏幕长短边模式)-port(当前屏幕横竖屏显示模式)-car(dock模式)-night(白天或夜晚)-ldpi(屏幕最佳dpi)-notouch(触摸屏模类型)-keysexposed(键盘类型)-nokey(硬按键类型)-navexposed(方向键是否可用)-nonav(方向键类型)-v7(android版本)
注意:
1)屏幕的像素密度修饰符,'依据Android会选择最接近屏幕像素密度的一个文件',不会因为与设备配置不一样而被排除掉,
即使我们的设备现在是hdpi,但是drawable-port-ldpi/也不会因为限定符的原因被排除,因为在这个阶段,所有的
屏幕密度都被考虑进行适配通常来说,Android更倾向于缩小一个比较大的图片而不是放大一个比较小的图片。
![图片.png](http://upload-images.jianshu.io/upload_images/2588358-0b932b225a82c04a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2)根据屏幕尺寸(small, large等(已被淘汰))限定符选择资源时,依据'向下匹配原则'如果没有更好的匹配资源,
则系统将使用专为小于当前屏幕的屏幕而设计的资源(例如,如有必要,大尺寸屏幕将使用标准尺寸的屏幕资源)。
但是,如果唯一可用的资源大于当前屏幕,则系统不会使用这些资源,并且如果没有其他资源与设备配置匹配,
应用将会崩溃(例如,如果所有布局资源均用 xlarge 限定符标记,但设备是标准尺寸的屏幕)
二、drawable 与mipmap的区别
引入mipmap的原因:在apk应用于手机时,系统会去选择对应的资源目录,有时启动图标ic_launcher会不合适,但是其他的资源目录已经被过滤掉了,这样导致了在手机显示上,启动图标不正确的现象。而mipmap可以保留着一个ic_launcher,而且也仅仅需要一个分辨率的icon,自动会缩放成其他分辨率的ic_launcher
将所有启动器图标放在 res/mipmap-[density]/ 文件夹中,而非 res/drawable-[density]/ 文件夹中。无论安装应用的设备屏幕分辨率如何,Android 系统都会将资源保留在这些密度特定的文件夹中,例如 mipmap-xxxhdpi。此 行为可让启动器应用为您的应用选择要显示在主 屏幕上的最佳分辨率图标。