要适配不同的屏幕,重要需要的是要能够将不同的屏幕分辨出来,android提供了若干不同的维度来进行限定(qualifier,有的翻译为限定词)
上图所示为经常使用的1些维度,不过不是全部,全部的维度可以在官方的列表中查找。
图中从左到右依照箭头唆使方向的优先级顺次下降(查找匹配资源的时候会用到优先级),同时在对res子目录采取限定词进行命名的时候,也必须依照这个优先级进行命名,例如res-sw600dp-port是对的而res-port-sw600dp就会出现编译毛病。有些维度可以有很多不同的具体参数,如smallestWidth,有些只能有固定的1些选择,如语言,屏幕方向port/land这类。
以下分别来介绍各个维度:
1、语言(zh-rCN), 主要可以用ISO 639⑴标准定义的两个字母的语言代码
2、smallestWidth最短可用宽度(sw-<N>dp),这个是从android3.2开始加入的,表示装备可用的最短宽度,与屏幕方向无关。但是,这个参数在使用时会触及到屏幕上的1些组件,如果屏幕上有navigation bar等,则最短可用宽度可能其实不到屏幕的最短边的数值,由于这个参数指的是我们的UI可用的区间。
适配流程:当多个目录都使用了该限定词的时候,匹配原则为不大于可用宽度的最大值。即如果屏幕最短边为1536,屏幕密度为xhdpi(即320dpi),1536/2 = 768,则在所有的sw-<N>dp当选择小于等于768的最大值,也即向下查找匹配。
3、available width(w-<N>dp)与smallestWidth类似,但是与屏幕方向有关,向下匹配
4、screenSize屏幕尺寸,根据屏幕对角线大小来界定(单位inch-英寸),可分为small/normal/large/xlarge。适配顺序为从高到低,如果只有超过当前实际尺寸的目录中有定义,则crash。这个维度从android3.2开始已不建议使用,建议采取shortestWidth。
5、屏幕方向,这个是最简单的,横向纵向
6、Screen density屏幕密度(dots per inch),ldpi/mdpi/hdpi/xhdpi/xxhdpi分别对应的屏幕密度为120/160/240/320/480/640dpi,在放置资源的时候资源大小也要依照相应比例。(决定1dp代表多少pixel)。
适配流程:优先从当前屏幕密度匹配的目录查找,如果没有则不断向上层查找(偏向于将大图片缩小,而不是小图片放大),如果上层没有则向下层查找,如果都没有,才取默许的目录,定位到特定目录后,会根据定位到的目录与当前屏幕密度的比例关系进行缩放操作。
7、分辨率 (800*480),官方文档上已没有,但目前仍可以使用,优先级介于nav和platform之间,适配顺序为从高到低
8、Platform version:参见Api Levels。适配顺序也是从高到低
1、为不同的屏幕尺寸及方向提供不同的layout,dimen
2、为不同的屏幕密度dpi提供不同的drawable
3、提供默许资源避免crash
4、修改某个目录下的值的时候,确认其上层是不是有配置该参数值,如果有,则可以直接修改;如果没有,则要将本层的值复制到上层以后再来修改本层的值
Android官方:
https://developer.android.com/guide/topics/resources/providing-resources.html
https://developer.android.com/guide/practices/screens_support.html