先熟悉几个Android屏幕的计量单位

屏幕尺寸:

指的是手机实际的物理尺寸也就是屏幕的对角线的长度,比如常用的4.0英寸,4.7英寸,5.0英寸,5.5英寸。

单位 英寸inch ,屏幕的对角线的长度,1英寸=2.54厘米。

屏幕分辨率:

屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以纵向像素*横向像素,如1960*1080、1280*720 、800*480。

屏幕像素密度 dpi:

屏幕像素密度是指每英寸上的像素点数 dpi:“dot per inch”的缩写。屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。

假设设备内每英寸有160个像素,那么该设备的屏幕像素密度=160dpi

屏幕尺寸、屏幕分辨率、屏幕像素密度之间的关系:

加入一个手机的屏幕分辨率是X*Y  屏幕尺寸是M ,

那么这个手机的屏幕像素密度 =

android 布局中添加线条_屏幕尺寸

这里用更加直观的形式表示一下 假设 屏幕分辨率为 1920*1080,屏幕尺寸为5英寸,则屏幕像素密度为:2203/5=

android 布局中添加线条_屏幕尺寸

440dpi

android 布局中添加线条_屏幕尺寸

下面在解释几个概念:

px(像素):

px是pixel的缩写,pixel即像素,它不是自然界的长度单位。px就是一张图片中最小的点,一张位图就是由这些点构成的。1024px就是1024像素。

dp(密度无关像素):

density-independent pixel,叫dp或dip,与终端上的实际物理像素点无关。单位:dp,可以保证在不同屏幕像素密度的设备上显示相同的效果。

Android开发时用dp而不是px单位设置图片大小,是Android特有的单位 场景:假如同样都是画一条长度是屏幕一半的线,如果使用px作为计量单位,那么在480x800分辨率手机上设置应为240px;在320x480的手机上应设置为160px,二者设置就不同了;如果使用dp为单位,在这两种分辨率下,160dp都显示为屏幕一半的长度。

dp与px的转换:

因为ui设计师给你的设计图是以px为单位的,Android开发则是使用dp作为单位的,那么我们需要进行转换:

在Android中,规定以160dpi(即屏幕分辨率为320x480)为基准:1dp=1px

android 布局中添加线条_屏幕尺寸

sp(独立比例像素):

scale-independent pixel,叫sp或sip 单位:sp

Android开发时用此单位设置文字大小,可根据字体大小首选项进行缩放 。

Android 屏幕适配最蛋疼的就是 Android手机的分辨率都不太统一,不像苹果手机 只有四五种,但是我们也没必要适配所有的分辨率

android 布局中添加线条_屏幕尺寸

上面这张图是目前主流分辨率排行。

考虑到手机分辨率的不同,为了能让我们的程序在不同分辨率的手机上显示出一样的效果,我们需要对我们的图片资源 和布局资源进行适配处理。

所谓的屏幕适配 主要也就是对于 layout和drawble 的适配。

官方的标准:

xlarge screens are at least 960dp x 720dp

large screens are at least 640dp x 480dp

normal screens are at least 470dp x 320dp

small screens are at least 426dp x 320dp

layout 根据根据手机分辨率来区分,当手机分辨率为高分辨率时,就去加载相应的 目录下的资源。

drawable 图片资源 根据

在相应位置创建相应的文件夹:

res/layout/my_layout.xml // layout for normal screen size ("default")

res/layout-small/my_layout.xml // layout for small screen size

res/layout-large/my_layout.xml // layout for large screen size

res/layout-xlarge/my_layout.xml // layout for extra large screen size

res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation

res/drawable-mdpi/my_icon.png // bitmap for medium density

res/drawable-hdpi/my_icon.png // bitmap for high density

res/drawable-xhdpi/my_icon.png // bitmap for extra high density

这里我们分别拿 1280*720 余 1920*1280 两种分辨率去演示一下:

android 布局中添加线条_屏幕尺寸

在Layout 与  layout-xlarge 下面分别有 两个activity_main.xml 布局, 当用 1920*1200 分辨率去加载 时,界面显示的是

android 布局中添加线条_屏幕尺寸

当用 1280*720 分辨率去加载 时,界面显示的是:

android 布局中添加线条_屏幕尺寸

由此可以得出结论

可以看出, 当加载大分辨率时,如果 xlarge 下面有相应的布局,则会去加载 相应的布局,如果我没删除xlarge 下面的布局,则会加载layout 下面的布局,

当然也可以通过layout-1920*1080 这样的目录去做区分 不同的分辨率 加载不同的布局。

相应的 对于 res-drawable 目录 也区分

根据 屏幕像素密度  由小到大:

ldpi                                120dpi

mdpi                              160dpi

hdpi                                240dpi

xhdpi                              320dpi

xxhdpi                            480dpi

则 像素密度越大(并不一定是分辨率越大,比如 分辨率1920*1080 如果屏幕尺寸是10 英寸,则会去加载hdpi),就会去加载响应目录下的图片资源。

实际开发中,UI可能会以 1334×750设计UI图, 接近于我们的1280*720,因此我们可以用画图 将设计图更改一下分辨率 改成1280*720的, 如果是1280*720 分辨率 ,假设手机屏幕尺寸为5英寸,则手机屏幕dpi= 293dpi,接近于320dpi 因此 将切图放在xhdpi 下。

以前由于手机分辨率较低,一般低于 800*480, 比如240*320 等等,我们通常将切图放在 hdpi 中,现在手机分辨率上来了,我们应该优先放在xhdpi 中。

根据不同的 dpi , drawable  目录下的匹配规则是  先去找 对应的 dpi 下, 比如 : 1280*720 dpi 为293,如果需要一张资源图片, 先去找xhdpi, 如果没有,则去hdpi 下面去找。 重复上述方式直到找到最先最接近的资源图片。

这张图片可以描述出  drawable根据dpi以及  layout 根据 屏幕尺寸  不同的对应关系:

android 布局中添加线条_屏幕尺寸

上面介绍的 大多是  Android 设备 加载的原理,在实际开发中我们还是要遵循以下方式去遵循UI适配:

1 .使用”wrap_content”、”match_parent”和”weight“来控制视图组件的宽度和高度。

2. 使用代码设置宽高,通过代码计算 手机分辨率 去动态设置 view 的 layoutparams 也是比较常用的方式。

比如 弹窗,在高分辨率手机上 获取手机分辨率,然后设置layoutparams  和 低分辨率手机上 设置layoutparams 可以使用 宽/ num 这样的比例。

3.尽量使用线性布局(LinearLayout)和相对布局(RelativeLayout) 。

4. 在需要确定size 的地方使用sp 表示文字  dp 表示 view 。

5. 优先选择 xhdpi目录,目前市面上最普遍的高端机的分辨率还多集中在720X1080范围内(xhdpi),所以目前来看xhpdi规格的图片资源成为了首选节省设计资源,设计师们一般都会用最新的iPhone6和iPhone5s(5s和5的尺寸以及分辨率都一样)来做原型设计,iPhone主流的屏幕dpi约等于320, 刚好属于xhdpi,所以选择xhdpi作为唯一一套dpi图片资源,可以让设计师不用专门为Android端切图,直接把iPhone的那一套切好的图片资源放入drawable-xhdpi文件夹里就好,这样大大减少的设计师的工作量。

6 .图片资源使用优先级  drawable > .9.png >.png  优先使用drawable 绘制背景, 能不用png,就不用png,可以减少图片资源占用的空间。

相关:

应用启动图标的适配

android 布局中添加线条_屏幕尺寸

对于使用Android studio 构建的项目, 会有mipmaps 和 drawable 两个目录,那么这两个目录怎么选择呢?

mipmap系统会在缩放上提供一定的性能优化。

可以把 他当做drawable 使用,但是注意 .9.png 不可以放在 mipmaps 目录里,只能放在drawable。

对于启动图标 优先选择 mipmaps中。