android中关于屏幕适配的那些事。

来源:互联网 发布:北京奥运会会徽知乎 编辑:程序博客网 时间:2024/06/01 08:17

对于很多初学者来说,一提到屏幕适配这个话题首先想到的应该就是使用warp_content,match_parent,weight等这些属性让布局得到一个比例的缩放,从而使布局在不同大小的屏幕上显示的效果也能够相同,然而这些属性只是屏幕适配中的一部分。

在说适配之前,不得不提到的是px,dpi,dp,dip之间的关系。

px:像素单位。例如480*320就是指像素。480px * 320px

dpi:像素密度。说白了就是一英寸有多少像素点。

dp:dp是专门给开发者制定的长度单位,它是一种不依赖于像素的计量单位。

例如:480*320,当每英寸的像素数量为160px时(也就是160dpi),1px = 1dp。所以以160dpi为基准。

    而如果是240dpi呢?1dp等于多少px呢?1 * (240dpi / 160dpi) = 1.5px。所以这个时候1dp = 1.5px。

dip:其实和dp是一样的,后来google统一制定为dp开发。

确切的来讲,如果这种方式是适配屏幕尺寸中的其中一种方法,那么对于其他方式的屏幕适配还有那些呢?

屏幕适配可以分成两个方面。

1,适配屏幕尺寸。

2,适配屏幕密度。

首先我们先来看适配屏幕尺寸,这个各位很好理解,那么我们如何来适配尺寸呢?接下来一起来探讨一下。

1,使用warp_content,match_parent,weight属性。

2,禁止使用绝对布局。

绝对布局在使用过程中对控件的定位很容易,可一旦遇到屏幕旋转的时候就会出现定位不准确的问题,所以这个布局尽量避免使用。

3,使用点9图。

相信开发的童鞋都用过点9图,这里就不详细说了。

4,使用限定符。

可能有的人没有听说过限定符又或者不叫这个名字,drawable-mdpi,而这个mdpi就是限定符。那么我们应该怎么利用这个限定符完成我们的屏幕适配呢?

layout后面的swxxxdp就是我们的限定符,这些是什么意思呢?sw的完整英文是small width 最小宽度的意思,也就是说最小宽度为600dp以上时,使用第二个layout文件夹中的布局文件,当然,所有的layout中的布局的命名是要相同的。

这当然是一种解决方式,可是当我们的布局过多时,后期在维护起来肯定会为我们增加很多的工作量,这个时候应该怎么解决呢?


我们看,我在valuse后面添加了land(横屏)和port(竖屏)的限定符,其中添加layout.xml资源文件。

在我们手机横屏时,系统就会调用values-land中的layout.xml中的布局。当然,在我们setcontentview时,应该调用的布局是main,而不是某一个布局。

而下面的isLand是我们获取不同屏幕时做出的动态响应。


接下来我们再来看看适配屏幕密度,什么叫适配屏幕密度呢?其实和上面提到的dpi有关系的。

我们上面说在160dpi的情况下,1px = 1dp ,所对应的就是mdpi,所以在切图时应该按照2:3:4:6:8的比例来切。

所以有了这个概念之后,我们再来看看dpi和android里面的drawable的对应关系。

我们以android Design中的说明为依据。看一下这张图。

在设计图标时,对于五种主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)应按照 2:3:4:6:8 的比例进行缩放。例如,一个启动图标的尺寸为48x48 dp,这表示在 MDPI 的屏幕上其实际尺寸应为 48x48 px,在 HDPI 的屏幕上其实际大小是 MDPI 的 1.5 倍 (72x72 px),在 XDPI 的屏幕上其实际大小是 MDPI 的 2 倍 (96x96 px),依此类推。

提示: 虽然 Android 也支持低像素密度 (LDPI) 的屏幕,但无需为此费神,系统会自动将 HDPI 尺寸的图标缩小到 1/2 进行匹配。

最后一个问题,如果android中所有的设备只使用一套图片的话,这一套图若不是手机自身dpi所对应的目录下的话,那么会给android应用造成内存浪费,导致内存增大,所以在条件允许的情况下,尽量使用多套切图。

原创粉丝点击