由于安卓的开源,各种设备的尺寸也是五花八门,我们无法做到任何设备都适配(特殊要求除外),所以只能针对目前比例最大的几种机型进行适配
首先普及几个概念
px是构成图片的最小单位,dpi是像素密度,对角线的像素除以长度,dip(也叫作dp)是密度无关像素,160dpi的设备上,1dip=1px。1dip 所等于的px和dpi成正比,也就是说在320dpi的设备上,1dip=2px。
sp可以根据文字大小首选项进行放缩,谷歌官方推荐使用sp作为字体的单位,应该使用12sp以上且为偶数作为字体大小,否侧可能看不清或者放缩时可能造成精度的丢失
名称 | 像素密度范围 |
---|---|
mdpi | 120dpi~160dpi |
hdpi | 160dpi~240dpi |
xhdpi | 240dpi~320dpi |
xxdpi | 320dpi~480dpi |
xxxhdpi | 480dpi~640dpi |
支持各种屏幕尺寸的工作主要有以下几个方面
1. 使用wrap_contnet、math_parent、weight
2. 使用相对布局,禁止绝对布局
3. 使用限定符
4. 使用自动拉伸位图
1.使用wrap_contnet、math_parent、weight
在LinearLayout时,如果想两边的控件大小固定,中间的控件填充剩下的空间,可以设置中间控件的weight为1,其他两个不设或者设为0。
如果设置了weight最好把想高度或者宽度设为0,比如想横向用weight,那么就把宽度设为0,设为0后宽度或者高度和weight成等比例,weight越大宽度或者高度越大。
如果两个控件设置了math_parent和weight的话
weight计算出来的高度=原来宽度+剩余空间*weight所占百分比
如
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="button1"/>
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="button"/>
</LinearLayout>
设L是屏幕宽度,Button1现在的宽度是2/3L,他原来的宽度应该是L,剩下的宽度是L-2L,然后它weight所占百分比是1/3
2/3L=L+(L-2L)*1/3
2. 使用相对布局,禁用绝对布局
如果是按照比例摆放的就用线性布局,如果要控件之间有特殊要求的就用相对布局
3.使用限定符
使用尺寸限定符,在values文件夹加上尺寸,然后应用可以根据不同设备尺寸选择,如values-480x320
4.使用自动拉伸
.9图左边和上边是拉伸区域,下边和右边是padding区域
在左边和上边设的点所在的线会被拉伸,下边和右边所设的线的交叉区域保持和圆图相同的padding
.9图要在保留图片的两侧点相同的点,线不要穿过图片,线上点会被拉伸,若某边不需要拉伸可以不设点
最后放一个鸿洋大大的彩蛋