为什么要适配?

我们先来看一组统计数据,这是国外opensignal给出的统计数据,我们来看看去年8月份的统计数据,参考链接

我们先来看看几个图表:
2014设备分布图:

2015设备分布图:

设备品牌分布:

屏幕尺寸分布:

系统分布图:

与ios对比图:

从上面几个图就可以看出android设备多,品牌多,屏幕尺寸多,还有系统版本分布比较大,碎片化比较严重,这也就是android之所以要进行适配的原因。并且可以看出android的适配包括了系统版本的适配,屏幕尺寸的适配等等。

各种各样的概念

单位

1:px (pixel):像素,屏幕上的点,最小的独立显示单位,px均为整数,没有小数。一般都是正方行像素参考链接
2:in:表示英寸,每英寸相当于2.54厘米

概念

1:screen size(屏幕尺寸):屏幕的物理尺寸,表示的是对角线长,如手机屏幕3.5寸,就表示对角线长度为3.5寸,大概8.89厘米。
2:屏幕分辨率:指屏幕在横边和纵边上的像素点数,单位是px,比如1920*1080
3:屏幕像素密度:dpi(dots per inch):每英寸像素点数,比如120dpi,160dpi,它与屏幕尺寸与屏幕分辨率有关。

android单位与换算

1:dp 或者dip,设备独立像素,即密度无关像素,注意与dpi不同,以160dpi为基准,1dip=1px
2:屏幕密码,density = dpi / 160,因此如个屏幕密度为1则1dp = 1px, 如果为2则1dp = 2px
3:sp(scale-independent pixels),字体的推荐单位,可以根据文字首选项进行大小缩放,官方建议最小使用值为12sp,其次尽量使用偶数值。

*dpi

mdpi, hdpi, xhdpi,xxhdpi,xxxhdpi
mdpi → [120dpi ~ 160dpi]
hdpi → [160dpi ~ 240dpi]
xdpi → [240dpi ~ 320dpi]
xxdpi → [320dpi ~ 480dpi]
xxdpi → [480dpi ~ 640dpi]

总结

比如一个手机屏幕分辨率480 * 800 , 屏幕尺寸3.7in,它的dpi是多少,在布局中宽设置320dp,该宽度为多少像素?
A:理论计算值:先计算出对角线的像素点数480 * 480 + 800 * 800 = 933*933,再计算出每英寸的像素点数 933/3.7 = 252dpi
最终计算出的dpi为252。
计算320dp对应的像素值:首先计算出屏幕密度,屏幕密度值则相当于1dp对应的像素值:
320 * (252/160) = 504px, (手机屏幕才480px,算出的宽度居然比屏幕还宽,如果成立,则说明如果在上诉屏幕上设置为320dp,则有一部分处于屏幕外)
NOTE: 手机上面计算出的DPI为理论值,实际上只有120(low)、160(medium)、240(high)、320(xhigh)等这几种,
因此实际的计算公式为:
320 * (240 /160)=480px,与屏幕宽度相同,说明在上诉屏幕设置为320dp,刚好占据整个屏幕。

怎么适配?

上面仅仅是知道了为什么适配,和各种各样的概念,那怎么适配呐,这里主要看手机不涉及平板适配?

我们先看看代码的res结构

以下以drawable为例,我们看到分别有多个drawable文件夹,不同的文件夹分别连上的不同的修饰符,修饰符就表示了当前代码的系统属性,系统在加载的时候会根据当前手机的各种属性与修饰符,从对应的文件夹加载图片。由此可以得出如果要适配所有的手机,最好是每种尺寸都放置一套图,

切图规则

从上面的概念我们知道,160dpi的时候 1dp=1px,因此在设计图标时,(mdpi, hdpi,xhpi,xxhpi,xxhpi)的比例值为 2:3:4:6:8。比如系统icon,mdpi为48*48,则xdpi为72*72,比例值为1.5。
从上图res结构看到有一类mipmap- *文件夹,这个系统新加为了放置系统图标的文件夹。

各种图标的尺寸:

宽度值设置

我们先来看看我们在一个界面中设置一个320dp宽度的一个view。

从图上可以看到不同的屏幕上展示了不同的效果(忽略平板),有的手机上占满了整个屏幕宽度,而有的手机上确只占据屏幕宽度的一部分。因此在视觉出图的时候,比如已800 * 480的尺寸出图,标注占满整个屏幕宽度240dp,则真实展现的效果则会在各个手机上不一致。

因此在开发中,可以采用match_parent来设置占满整个屏幕,如果是其他尺寸,可以采用自适应或者weight来设置view所占用的宽高。

限定符

我们从上面看到有*dpi作为了限定符,同时还有其他的比如large限定符,sw限定符等等限定符,就不一一展开了。

.9图片

.9图为系统在图片周围加一个像素的透明边,图片必须要以.9作为描述符。
比如以一个图片来作为背景,如果不是.9图片,则如果内容区域大于图标,则图片会被拉伸。下图四个角都被拉伸了。

下图设置了图片的拉伸区域,则可以看到图片的四个角都未被拉伸,这样最终呈现的视觉效果就好很多。

标注位置:相邻两边进行标注,不能只标注一边,也不能只标注相对的两边,如果只标注两边,则拉伸区域为相交部分,文本区域为右边与下边控制,如果不标注则沾满整个宽度,

同时需要注意的是:图片可以分段标注,但图片最终拉伸的效果与标注的像素点有关,比如同一边上下均被标注且上下像素点比为3:1,则最终拉伸比例也是3:1。

结束语

a:hdpi ,xhdpi等中的相同图片大小要成比例,这样才能在相同屏幕不同分辨率下展现一致。注意上面的2:3:4:6:8

b:同一类型,图片大小要一致,可能多人做多个模块,导致切除的同一类型图片相差1,2个像素(可以建立一个资源库,反查已有图标尺寸)。

c:相同图片问题,不同人做不同模块,很多图标都是相同的,由于开发不同,会导致一个包中有相同图片,这样会导致包大小增长。

d:能使用纯色的图片,就让开发尽量使用颜色值,不用切图。

e:jpg与png图片相比较,jpg大小会小很多,如果有大图且没有模糊渐变等要求,尽量采用jpg格式。

f:很多简单图片都能用代码实现,比如圆,矩形等,可以让开发用代码实现,减少包的大小。

g:如果包的大小太大时,尽量保证更高尺寸的图片存在,这样低屏幕密度的手机也能展现很清晰的图片,但是如果只有小图,就会放大拉伸,会导致图片变形或者不清晰。

h:.9注意标注拉伸区域与内容区域,与图片外边距的padding,可以在图上直接标注。(如果内容区域上下距离不相等,再填充多行文字时会造成文字不居中,这时可以直接在图片上空出padding)

i:.9图片只能拉伸不能压缩,压缩会导致图片变形,因此在作图过程中要确定一下图片的最小尺寸,(比如,给出一个确定高度的矩形区域,里面放置一个初始高度大于矩形的.9图片,会导致图片压缩)。

j:.9图片一般只做小尺寸就可以,除非边框有渐变等元素,才做多个尺寸。

k:关于图片标注,美术要转换一下单位,px转换到相应的dp上,开发可以直接使用该数值。

l:关于字体,字体大小sp,但是如果字体呈现在一个固定高度的矩形框中时,再能调整字体大小的手机上时,可能会展示不全(展现字体的外部图片,背景等尽量不要写死高度)。

m:标注图片时,如果一个icon占满整个宽度,则可以不用标注icon宽度尺寸,只需要标注距离边框的尺寸,开发会采用自适应,如果确定宽度,在有的屏幕上只能占据一半宽度,

更多相关文章

  1. android中自定义checkbox大小和图片
  2. Android(安卓)仿知乎创意广告 广告还能这么玩?
  3. Android逐帧动画
  4. android压缩图片保存为文件后显示方向被改的解决方法
  5. Android(安卓)效率开发之图片---Glide 旋转图片处理
  6. Android(安卓)APP内存优化之图片优化
  7. Android(安卓)Glide图片加载库基础使用详解
  8. 【幻灯片分享】Android在多屏幕、多设备上的适配 | 布丁 任斐 |
  9. 彻底解决Android(安卓)拍照 内存溢出 Out of Memory的问题

随机推荐

  1. android 焦点问题
  2. android 网络访问-图片处理优秀开源项目
  3. Android7.0 MTK方案 静默安装和卸载
  4. 设置TextView文字居中
  5. 使用ProgressBar实现进度条
  6. Android布局属性全面剖析
  7. 设置环境变量ANDROID_SDK_HOME有什么用?
  8. 实现了在android实现左右滑动切换界面的
  9. PreferenceActivity的使用 android
  10. Ndk(jni)调用第三方的so库