频道栏目
首页 > 资讯 > Android > 正文

Android布局和图片使用规范

16-07-14        来源:[db:作者]  
收藏   我要投稿
先熟悉几个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 ,
那么这个手机的屏幕像素密度 =
这里用更加直观的形式表示一下 假设 屏幕分辨率为 1920*1080,屏幕尺寸为5英寸,则屏幕像素密度为:2203/5=440dpi
 
下面在解释几个概念:
 
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

sp(独立比例像素):

scale-independent pixel,叫sp或sip 单位:sp
Android开发时用此单位设置文字大小,可根据字体大小首选项进行缩放 。

 

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

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

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

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

官方的标准:

 

  • xlargescreens are at least 960dp x 720dp
  • largescreens are at least 640dp x 480dp
  • normalscreens are at least 470dp x 320dp
  • smallscreens 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 两种分辨率去演示一下:

 

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

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

 

由此可以得出结论

可以看出, 当加载大分辨率时,如果 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 设备 加载的原理,在实际开发中我们还是要遵循以下方式去遵循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 studio 构建的项目, 会有mipmaps 和 drawable 两个目录,那么这两个目录怎么选择呢?

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

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

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

 

谢谢认真观读本文的每一位小伙伴,衷心欢迎小伙伴给我指出文中的错误,也欢迎小伙伴与我交流学习。
相关TAG标签
上一篇:初探React Native
下一篇:对OSS存储服务的初步认识(上传,下载)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站