Android 屏幕适配
为什么要屏幕适配
在讨论这个问题之前 我们先看下面的这张图:
这张图是在网上找到的,这张图显示的是国内的Android 各种设备的占有率,方块代表 Android 设备的品牌,方块中的碎片代表品牌下属机型,方块面积大小代表占有率大小。看完这张图,然后再看下面这张图:
这是 Android 设备的分辨率的用户活跃统计图,看着密密麻麻的分辨率,不用也知道,Android的屏幕碎片的程度太高了,我们开发出来的App,不可能只适应其中的一种或几种,至少应该适应大多数主流的手机,这样才算的上合格的App,为了这个目标,Android 屏幕适配是必须要做的。
需要知道的几个概念
上面我们列举了几张图,简单解释了一下,屏幕适配的必要性,其中提到了屏幕的分辨率,那什么是分辨率呢?
分辨率 :是指在屏幕上横纵向上的像素点数。像素的单位是px,比如上面的 1920x1080,指的就是纵向像素x横向像素。
除了分辨率之外,还有几个我们应该知道的概念:
屏幕尺寸 :指的就是屏幕对角线的长度。类似于我们说的电脑屏幕的尺寸。当然这里说的是英寸;1英寸 =2.54厘米。像我们平时说的5.2寸,5.5寸的手机,就是指的屏幕的英寸长度。
像素密度 :指的是屏幕的像素密度,即我们的屏幕上每英寸的像素点数。用英文就是“dot per inch”, 我们平时使用的是它们的缩写“dpi”。根据其定义我们就可以知道,像素密度跟屏幕的大小和屏幕的分辨率都有关系。跟"dpi"相近的还有一个“PPI”,"PPI"为 "pixel per inch"的缩写,意为每英寸的像素点数,跟上面的dpi 的意思很相近,其实还有些区别的,区别在于“dot”和“pixel”之间,当然在这里我们可以理解为一个意思,如果要细究它们的区别的请参看 PPI和DPI 的区别 。我们可以根据其手机的尺寸和分辨率算出它们的像素密度,比如华为荣耀7,下图是我在京东上截的它给出的参数图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bivN5S1b-1588068568400)(http://7xrxe7.com1.z0.glb.clouddn.com/%E5%8D%8E%E4%B8%BAP7%E5%88%86%E8%BE%A8%E7%8E%87.png)]
它的屏幕尺寸为5.2寸,分辨率为 1920x1080,我们算出
p
p
i
=
d
p
i
=
192
0
2
+
108
0
2
/
5.2
≈
423
ppi = dpi = \sqrt{1920^2+1080^2} {/5.2} \approx423
ppi=dpi=19202+10802/5.2≈423
按上面算出的值为423,,在Android Studio 的模拟器上同样规格的模拟器,给出的dpi是420,这应该是在允许的范围内。
尺寸单位 : 在上面我们提到了px,就是一种尺寸单位,其它的还有 dip ,dp ,sp
dip/dp:dip跟dp 其实是一个意思,都是 Density Independent Pixels 的缩写,即密度独立于像素,也就是说密度跟像素无关。根据上面我们提到过dpi,如果一英寸里含有160像素,这个屏幕的像素密度就是 160dpi。在 Android 就是以160dpi为基准, 在160dpi的手机上1dp = 1px ,如果是320dpi的手机上 1dp = 2px。以此类推。如果我们在 160dpi 的手机上划一条 160px的横线显示起来会跟屏幕的宽一样,如果我们在在320dpi的手机上划一条160px 的线,则会显示为屏幕宽的一半。当我们使用dp作为单位时,效果就不一样了,如果我们画一条160dp 的横线,这两种手机的显示都是为屏幕的一半。
sp : 跟dp类似,它是“scale-independent pixels” 的缩写,我们一般使用在文字大小的设置上,因为它会根据文字的大小在不同的屏幕上进行缩放。
做过开发的我们应该都知道,在放置图片(drawable)和一些资源(values)的文件夹都会有不同的后缀,用来区分不同的像素密度下的图片和dimen值,如下表:
名称 | 像素密度范围 |
---|---|
mdpi | 120dpi-160dpi |
hdpi | 160dpi-240dpi |
xhdpi | 240dpi-320dpi |
xxhdpi | 320dpi-480dpi |
xxxhdpi | 480dpi-640dpi |
可以看出它们的比例由上往下是:2:3:4:6:8
如果使用AndroidStudio 的同学应该知道,现在app的应用图标都独立出来,放到mipmap文件夹下,
每个文件夹下对应的都是各个像素密度范围的手机应该显示的图标。比如在mdpi下的尺寸是 48x48,hdpi下的是72x72,xhdpi下的是96x96,xxhdpi 下的是 144x144,xxxhdpi下的是 192x192。在这里我们也可以看到它们是按照2:3:4:6:8的比例进行缩放的。知道这些,如果过有的UI不知道给你切多大的图时,就可以拿这个告诉它,如果忘记了就去,mipmap 文件夹下去看看图片的尺寸久OK了。