一、为什么要做屏幕适配
由于Android系统的开放性,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,于是导致碎片化,包括Android系统碎片化(小米定制的MIUI、魅族定制的flyme、华为定制的EMUI),Android机型屏幕尺寸碎片化(5寸、5.5寸、6寸),Android屏幕分辨率碎片化(320x480、480x800、720x1280、1080x1920)。当出现碎片化时,就很容易出现同一元素在不同手机上显示不同的问题。
所以屏幕适配使得某一元素在Android不同尺寸、不同分辨率的手机上具备相同的显示效果。
二、dp与px的转换
在Android中,规定以160dpi(即屏幕分辨率为320x480)为基准:1dp=1px
密度类型 | 代表的分辨率(px) | 屏幕密度(dpi) | 换算(px/dp) | 比例 |
低密度(ldpi) | 240x320 | 120 | 1dp=0.75px | 3 |
中密度(mdpi) | 320x480 | 160 | 1dp=1px | 4 |
高密度(hdpi) | 480x800 | 240 | 1dp=1.5px | 6 |
超高密度(xhdpi) | 720x1280 | 320 | 1dp=2px | 8 |
超超高密度(xxhdpi) | 1080x1920 | 480 | 1dp=3px | 12 |
三、解决方式
1、“布局”匹配
- 根据屏幕的配置来加载相应的UI布局,需要为不同屏幕尺寸的设备设计不同的布局,使用最小宽度(Smallest-width)限定符,如layout-sw600dp,即无论是宽度还是高度,只要大于或等于600dp,就采用layout-sw600dp目录下的布局,其他的就使用默认layout目录下的布局。
- 使得布局元素自适应屏幕尺寸,使用相对布局(RelativeLayout),禁用绝对布局(AbsoluteLayout)
- 使用布局别名,可以解决文件名的重复从而带来一些列后期维护的问题。
2、“布局组件”匹配
- 使得布局组件自适应屏幕尺寸,使用"wrap_content"、"match_parent"和"weight“来控制视图组件的宽度和高度。
- 在不同屏幕密度上,使用密度无关像素dp、sp。
3、“图片资源”匹配
- 可以使用自动拉伸位图:.9图片类型,放在drawable文件夹
- 提供备用位图(符合屏幕尺寸的图片资源),即一套分辨率=一套位图资源,放在 res/ 下的相应子目录中(mdpi、hdpi、xhdpi、xxhdpi)
系统自动适配图片的方式
系统会先选择与机器密度匹配的目录文件,如果没有,再依次找更高密度的目录,如果还没有,再找低密度的,最后找drawable里的。
如当前设备的dpi是320,系统会优先去drawable-xhdpi目录查找,如果找不到,会依次查找xxhdpi → xxxhdpi → hdpi → mdpi → ldpi → drawable
4、解决控件的屏幕尺寸和屏幕密度的适配问题
问题
- 因为屏幕密度(分辨率)不一样,所以不能用固定的px
- 因为屏幕宽度不一样,所以要小心的用dp
解决
- 根据不同屏幕密度,控件选择对应的像素值大小。
- 以某一分辨率为基准,生成所有分辨率对应像素数列表。
- 把生成的各像素数列表放到对应的资源文件res/values-480x320等。