要适配不同的屏幕,首要需要的是要能够将不同的屏幕分辨出来,android提供了若干不同的维度来进行限定(qualifier,有的翻译为限定词)
上图所示为常用的一些维度,不过不是全部,全部的维度可以在官方的列表中查找。
图中从左到右按照箭头指示方向的优先级依次降低(查找匹配资源的时候会用到优先级),同时在对res子目录采用限定词进行命名的时候,也必须按照这个优先级进行命名,例如res-sw600dp-port是对的而res-port-sw600dp就会出现编译错误。有些维度可以有很多不同的具体参数,如smallestWidth,有些只能有固定的一些选择,如语言,屏幕方向port/land这种。
以下分别来介绍各个维度:
1、语言(zh-rCN), 主要可以用ISO 639-1标准定义的两个字母的语言代码
2、smallestWidth最短可用宽度(sw-<N>dp),这个是从android3.2开始加入的,表示设备可用的最短宽度,与屏幕方向无关。但是,这个参数在使用时会涉及到屏幕上的一些组件,如果屏幕上有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