这个知识点已经有很多人写过相应的博客,但是自己一直没有能够深入的理解,最近终于抽出时间,决定把这个问题彻底的梳理清楚,这篇文章以安卓适配作为最终目的,一些基础知识的概念需要自己去百度这里就不再细说,毕竟知识只有使用才能发挥他的价值。
一、基本单位
首先介绍基本单位,这四个单位是必须要理解的,也是互相关联的,请注意他们之间的关联性。
- 英寸:一种长度单位,可以想象一下一把尺子。
- 像素(px):一个包含颜色信息点,需要注意的是这个点长度是不确定的,也就是说,一个像素点可能是一英寸,可能是两英寸,这里只是举例子说明像素点长度不确定,真实的像素点肯定不这么长,不然就变成马赛克了。
- dp:长度转换单位,这个是我自己的理解,举个例子:一个长宽都是50px的图片,定义50dp,在a屏幕上长宽还是50px,在b屏幕上长宽就会是60px,说的形象一些,如果把dp当成一个人,这个人会根据不同的屏幕尺寸,把同一张图片,根据屏幕大小的不同,放大或者缩小。
二、dp和屏幕适配
从上面对dp的形象解释,我们就知道了,为什么安卓要用dp作为单位,而不是px。接下来,还有几个概念需要解释:
- 屏幕尺寸:一般手机有,4寸,5寸,5.5寸等各种长度,这个4,5,5.5其实是手机屏幕对角线的长度,寸这个单位对我们来说并不常见,至少对我来说并不常见, 所以你完全可以把寸想象成厘米,或者其他自己熟悉的单位。
- 屏幕分辨率:屏幕分辨率,常见的有10801920,7201280,还有各种奇怪的手机分辨率,这个1080和1920是指的什么呢,就是我们上面说的px了,就是说这个屏幕上横着的像素点有1080个,竖着的像素点有1920个,如果不好理解,就把像素点想象成一个一个的小正方形,横着有1080个同样宽高的小正方形,竖着有1920个同样宽高的小正方形。
- dpi:一个手机既有尺寸又有分辨率,dpi就是把两个概念联系起来的东西,dpi的标准概念百度都有,这里就不再复制一遍,简单理解,dpi就是一个手机每英寸像素的数量,就是一个手机,一厘米长度上,有多少个像素点,需要注意的是,像素点的长度是不固定的。
三、屏幕适配
理解了上面的概念,我们就明白了为什么安卓的适配难,因为有不同的尺寸和不同的分辨率,这个不同尺寸不同分辨率的组合出来的dpi,导致了安卓手机屏幕碎片化,那么我们要解决的就是如何让同样一张图片,在不同的屏幕上,看起来都一样大小,这里的一样大小指的是比例一样大,比如在10801920的5寸屏幕上占了屏幕的一半,那么在10801920的5.5寸屏幕上也占一半,在1280*720的5寸屏幕上还是占了屏幕的一半,这就是我们最重要达到的目标。
在安卓机还没有碎片化到如此地步的时候,谷歌官方推出了dp这个概念,但是明白dp适配原理的开发者都知道,dp只能适配四种屏幕,就是所谓的ldpi,mdpi,xdpi,xxdpi,甚至xxxdpi(这里l代表low,m代表middle,可以帮助记忆这四种尺寸的顺序),而现在各种碎片化,导致dp的适配并不那么准确,也因此我们有了如下方案。
嗯,对的,就是给每一个常用分辨率设置一个dimen文件,当app运行的时候,就会自动去寻找对应分辨率下面的dimen文件,从第二张图我们可以看出,dimen单位命名是1080,也就是说,我只需要一套1080的图,就能够适配几乎所有的屏幕,那么大家要问了,这么多文件难道都是自己手写么,显然不是,身为一个程序员,全部自己手写简直太傻了,这里我是使用了一个可以自动生成适配文件的jar文件,并用.bat执行,可以生成,具体的适配工具已经上传到github,可以从github上下载https://github.com/ZeroNightStr/AndroidDimensTools
这个方案是我的朋友给我的解决方案,目前使用良好,所以想推荐给大家, 在写博客的过程中,为了查找一些资料,找到了鸿神的博客,发现他的解决方案和我的很相似,但是鸿神是用的生成value-1080*720+px这种方案,这里我用的是生成value-w1080dp+dp的方案,目前使用感觉良好。
四、注意点
1、多套图片
有了以上方案,可以让图片适配,但是我们还是建议两套图或者三套图,为什么?因为dp会拉伸或者缩小图片,影响图片的像素点数,导致图片模糊或者失真,极限想象一下,50px的图被拉伸成500px,肯定会有影响,所以为了防止这样的情况,有必要使用多套图片。
2、横屏竖屏
这个方法只适用于竖屏,对于横屏没办法适配,可以自己参考这个思路制作横屏适配。
3、文字适配
我使用的适配工具也生成了sp的适配,但是文字适配在实际使用过程中并不理想,给文字使用sp,在不同手机上字体大小是一样的,在小分辨率手机上文字占了一半,但是可能在大屏幕手机上就占了四分之一,用sp一直是谷歌官方建议,我也一直遵循这个建议,但是发现无法成功适配,于是做了测试,发现用dp反而能够好的让文字按照百分比适配,所以目前我的方案就是,用dp设置文字。
下面是使用sp设置图片的效果,可以明显看出一个基本占满整个屏幕,一个还留有一部分空隙
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你好"
android:textSize="150sp"
/>
720*1280.png
1080*1920.png
那么我们尝试使用生成的适配dp作为单位呢?
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你好"
android:textSize="@dimen/dp1080_530"
/>
dp01.png
dp02.png
可以看到使用dp的时候比例是一样的,所以目前文字的适配,我使用的是dp,当然我不知道这样有什么影响,不过目前来说很好用。
网友评论