您的位置:首页 > 移动开发 > Android开发

Android开发屏幕适配方案

2016-08-01 11:19 801 查看


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 代码如下

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-pi" style="color: rgb(0, 102, 102); box-sizing: border-box;"><?xml version="1.0" encoding="utf-8"?></span>
<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">resources</span>></span>

<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">item</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"main"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">type</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"layout"</span>></span>@layout/main_large<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">item</span>></span>
<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">resources</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>


编写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进行动态设置一个空间的宽、高等其他的属性进行动态适配。
其他适配以后想到的会继续不断的补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  安卓适配