Android自适应基础

Android系统开放,设备众多,自适应是个很麻烦的工程。不仅不同系统版本的适应,最头痛的还是不同分辨率、不同像素密度的适配。网上有很多谈自适应技巧的文章,有些可能看着不是很理解甚至有些带着坑,所以有必要先对一些基础概念有所了解,再谈自适应吧。

 

一、首先解释一个概念:屏幕密度

1、解释:英文表述为dpi:dots per inch,或者PPI:pixels per inch。意思很明显是每英寸的像素点数。

     另外提醒下,平常所说的手机或者平板是多少寸的,是指屏幕的对角线是多少英寸。

2、计算:假设屏幕分辨率宽高为 w × h,尺寸为 size 英寸,密度为 dpi,那么结合勾股定理很容易算出以下公式

      dpi = \sqrt{w^2+h^2}/size

例如屏幕是1080×1920,5英寸的设备,那么算出来密度大约是440。但实际上,从机器获取的densityDpi是480,怎么获取可参考另一篇很简单的博文 https://blog.csdn.net/lin_dianwei/article/details/82806575 。这是因为Android规定了几个密度值,不然的话各种各样的密度值无法做统一处理。几个密度值如下: 

密度 ldpi mdpi hdpi xhdpi xxhdpi
密度值 120 160 240 320 480
比例 3 4 6 8 12

有些地方,在每个密度下面还指定了一个分辨率,比如1080×1920对应xxhdpi,个人觉得这样会误导一批人,误认为1080×1920密度就一定是xxhdpi,其实看公式就知道,这里忽略了一个尺寸变量。

 

二、ldpi、mdpi、hdpi、xhdpi、xxhdpi有何用

1、看Android工程资源目录res下,就存在着drawable-ldpi、drawable-mdpi、drawable-hdpi等对应的几个目录。

它们的作用是,比如你的设备是hdpi的,你放了一个宽高都为100px的图片在drawable-mdpi下面,那么加载时系统会自动按照上面的比例,把图片放大成宽高为150px,如果把图片放drawable-hdpi下,那么加载下来的图片还是100px。

所以,我们的应用要适应不同密度的设备,一般来讲我们只需要做一套图放到对应的目录下,那么就可以自动适应其他密度的设备。

2、比如要适配分辨率为1280×800和1920×1200,尺寸都为10.1寸的设备,经过计算这两设备的密度为mdpi和hdpi。那么我们可以在PS中按照画布1920×1200的大小做一套图放在drawable-hdpi下就可以了,当然也可以做一套1280×800的图放drawable-mdpi下。站在UI人员的角度上,他做了一套像素为1920×1200的图片,那么里面的一些坐标,很可能也是按照像素px来算的,比如标注个150px,在hdpi机器上是150px,在mdpi机器上应该是100px。那么我们程序是否需要按照不同的密度分开两套不同的坐标呢?比如values-ldpi、values-mdpi、values-hdpi等。其实可以不需要。

这里先引入一个dp的概念,dp是与密度无关的抽象单位,在每英寸160点的显示器上,1dp = 1px,在每英寸240点的显示器上,1dp = 1.5px,跟上面表格密度比例一致。

这样我们只需要在values下设置个100dp就可以了,在mdpi机器上就是100px,在hdpi机器上就是150px,刚刚好。用getResources().getDimension(R.dimen.test)方法读取出来分别是100和150。所以一般程序都会使用dp为单位,而不是px。除非有些地方需要很细的的分隔线,可以使用1px这样。

 

三、字体sp

简单说下sp,跟用px表示的差别是sp的可以随着系统的字体大小而改变,而px不会。所以一般字体用sp就可以了。

 

暂时这些,有想到再补充。相信理解了一些基础后,对自适应工作会更有帮助。

 

你可能感兴趣的:(Android)