Android屏幕适配方案总结
日常开发中,难免遇到屏幕适配的方案,网上也有很多方案,在这里本人只是做一个总结,以免日后使用
单位的概念
- pt(point):磅,一个标准的固定长度单位,大小为1/72英寸,主要用于印刷与平面设计。1英寸=2.54厘米=72磅 1pt=0.03527cm
- px(pixel):像素,组成屏幕图像的最小点,一个相对大小单位。同尺寸屏幕中像素越小越多,代表屏幕分辨率越高,反之越高。
1pt=(ppi/72)*px
- 屏幕尺寸(screen size):屏幕物理尺寸,指屏幕对角线的长度,而不是屏幕的长度或高度。单位为英寸,4英寸、5寸手机……
Android把所有的屏幕大小分为四种尺寸:小、普通、大、超大(分别对应small、normal、large、extra large)
- 分辨率(Resolution):屏幕拥有像素的总数以及屏幕水平(宽)和垂直(高)方向的像素数量。
?
- ppi(pixels per inch):屏幕密度,指的是每英寸所拥有的像素数/每英寸像素。ppi数值越高,既代表显示屏能够以越高的密度显示图像。显示的密度越高,拟真度就越高。
- dpi(dots per inch):印刷计数单位,指每英寸所能印刷出来的网点数。衡量打印机打印精度的主要参数之一,值越大,表明打印机打印精度越高。电子屏上ppi=dpi
- dp(Density-independent Pixels):与屏幕无关的像素单位。Android开发虚拟单位,在每英寸160点的显示器上,1dp=1px;
- sp(Scale-independentPixels):Android字体大小虚拟单位。在每英寸160点的显示器上,当文字大小为100%的时候,1sp=1px。如果字体设置为sp,字体可以根据系统大小调节而变化。
适配方案
- 文件夹目录不同资源适配
1、建立对应屏幕分辨率的文件夹,例如屏幕分辨率为540*960则可以建立对应资源文件夹values-960x540,这样就会根据分辨率进行读取对应的文件信息。
2、考虑横屏和竖屏布局效果:Android有Layout-port和layout-land两个目录分别放置竖屏和横屏的两种布局文件,在手机屏幕发生转变,会自动调用相应布局文件。
3、适配大屏幕,有些时候需要考虑类似平板的的屏幕进行适配,可以吧xml布局文件放到layout-large文件夹下,此文件夹的命名要和layout下布局一样,在屏幕要超过7寸的屏幕会自动读取large下的文件。(注意:在android3.2之前的版本试用)
4、在android3.2之后的版本可以使用layout-sw600dp文件夹,sw是small width的简称,见名知意就是最小宽度的意思。这个文件夹的使用规则和layout-large一样,的那是这里代表宽和高的最小边为600dp的布局,也就是600dp以上的屏幕。
5、布局别名:有时候在sw600dp文件和large文件夹或者多个文件夹下都需要进行维护布局文件,这时候我们同样写两份代码有点多余,此时需要对布局进行设置别名来维护共同的一套。在layout下可以只有2个文件一个是小屏幕默认的如:main.xml,另一个是大屏幕如:main_large.xml。之后再values下配置别名,
默认的:values/layout.xml
最少宽度600dp:values/layout-sw600dp/layout.xml 代码如下
3.2之前大于7寸的:values/layout-large/layout.xml 代码如下
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="main" type="layout">@layout/main_large</item>
</resources>
- 编写xml时的适配
1、尽量使用wrap_content、match_parent、和weight。这样布局就会自动扩充。比如weight权重,用的时候可以按照比例进行分配,就不会出现显示不全等现象。
2、使用相对布局,由于RelativeLayout是根据位置进行控制,所以我们可以选择对应的参照物,例如一个按钮设置在父布局的右边,这样的话这样的话,无论父布局无论是多宽或者多高,这个按钮都在父布局的右边。
- 图片与资源的适配
1、我们可以适配不同的values,可以设置多份屏幕都 dimens文件,因为在720的屏幕上1dp等于2px到1080屏幕上就等于3px,所以我们可以根据不同的dimens设置不同的px或者dp的值在dimens文件中。
2、切不同尺寸的图进行适配。可以感觉umeng进行查看目前市场上最主流,用的最多的手机屏幕的信息,切对应的套图也是最常用的适配方式。但是图片也不建议过多,因为这样会对apk包的大小有影响。我们可以把这些图片进行压缩,顺便介绍一个压缩的工具网站,亲测效果还是不错的。
3、9patch图片的使用,我们称之为点9,这个工具就在sdk下面,网上教程一大堆我就不叙述了。
- 代码中进行适配
1、我们在自定义控件中,可以根据代码获取到当前的屏幕密度,然后对空间的大小进行设置,这样的话设置的代码就是动态计算宽度和高度的。如我们用画笔花的字体,会在不同分辨率上呈现不同的大小,这时候可以通过获取分辨率然后计算出我们要设置的宽度和高度。 2、其实在写代码时候经常会遇到在代码中计算的情况,例如我弹出一个单选框,需要动态设置高度,如果写死一个高度的话会对不同的选项有问题。
这样的话可以通过设置LayoutParams进行动态设置一个空间的宽、高等其他的属性进行动态适配。
- 其他适配以后想到的会继续不断的补充。