屏幕适配
为什么要做屏幕适配?
由于Android碎片化严重,导致开发中一套代码在不同手机上运行起来效果不是很多好,兼容性不是很好,这就需要对不同分辨率,不同屏幕大小的手机做屏幕适配。
屏幕尺寸是指屏幕对角线的长度。单位是英寸,1英寸=2.54厘米 比如常见的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等
屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1像素点,一般是纵向像素横向像素,如1280×720
屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写,屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。
dip:Density Independent Pixels(密度无关像素)的缩写。以160dpi为基准,1dp=1px
dp:同dip
dpi:屏幕像素密度的单位,“dot per inch”的缩写
px:像素,物理上的绝对单位
sp:Scale-Independent Pixels的缩写,可以根据文字大小首选项自动进行缩放。Google推荐我们使用12sp以上的大小,通常可以使用12sp,14sp,18sp,22sp,最好不要使用奇数和小数。
//我们最终的目的是将各种类型全部转为dpi
我们可以通过以下几种方式来支持各种屏幕尺寸:
1. 使用wrap_content、math_parent、weight
wrap_content:根据控件的内容设置控件的尺寸
math_parent:根据父控件的尺寸大小设置控件的尺寸
weight:权重,在线性布局中可以使用weight属性设置控件所占的比例
2. 使用相对布局,禁用绝对布局
简单的布局一般都使用线性布局,而略微复杂点的布局,我们使用相对布局,大多数时候,我们都是使用这两种布局的嵌套。
我们使用相对布局的原因是,相对布局能在各种尺寸的屏幕上保持控件间的相对位置。
3. 使用限定符
使用尺寸限定符
当我们要在大屏幕上显示不同的布局,就要使用large限定符。例如,在宽的屏幕左边显示列表右边显示列表项的详细信息,在一般宽度的屏幕只显示列表,不显示列表项的详细信息,我们就可以使用large限定符。
4.使用自动拉伸位图
自动拉伸位图,即android下特有的.9.png图片格式。
当我们需要使图片在拉伸后还能保持一定的显示效果,比如,不能使图片中的重要像素拉伸,不能使内容区域受到拉伸的影响,我们就可以使用.9.png图来实现。
要使用.9.png,必须先得创建.9.png图片,androidSDK给我们提供了的工具就包含.9.png文件的创建和修改工具
那么该如何解决控件的屏幕尺寸和屏幕密度的适配问题呢?
步骤1:以某一分辨率为基准,生成所有分辨率对应像素数列表
步骤2:把生成的各像素数列表放到对应的资源文件
步骤3:根据UI设计师给出某一分辨率设计图上的尺寸,找到对应像素数的单位,然后设置给控件即可
缺点:
由于实际上还是使用px作为长度的度量单位,所以和google的要求使用dp作为度量单位会有所背离
必须尽可能多的包含所有分辨率,因为这个是使用这个方案的基础,如果有某个分辨率缺少,将无法完成该屏幕的适配
过多的分辨率像素描述xml文件会增加软件包的大小和维护的难度