本文主要介绍Android界面适配的相关内容,适合1-3年Android开发工程师阅读。1、为什么要适配?让我们从一组统计数据和图表开始。【2014年设备分布图】【2015年设备分布图】【设备品牌分布】【屏幕尺寸分布图】【系统分布图】【与iOS对比】从以上几张图中我们可以看出安卓设备多,品牌多.屏幕尺寸较多,系统版本分布比较大,碎片化严重。这就是android需要适配的原因。另外android的适配包括系统版本的适配,屏幕尺寸的适配等等。2、关于适配各种概念单位——px(pixel):像素,屏幕上的点,最小的独立显示单位,px为整数,无小数。一般为方行像素参考链接——in:表示英寸,每英寸相当于2.54厘米。概念——屏幕尺寸(screensize):屏幕的物理尺寸,即对角线的长度。比如手机的屏幕是3.5英寸,那么对角线长度就是3.5英寸,也就是8.89厘米左右。——屏幕分辨率:指屏幕水平和垂直两边的像素点数,单位为px,如1920*10803:——屏幕像素密度:dpi(dotsperinch),像素点数每英寸,如120dpi、160dpi,与屏幕尺寸和屏幕分辨率有关。Android单位及转换dp或dip,device-independentpixels,即与密度无关的像素,注意它不同于dpi,基于160dpi,1dip=1px屏幕密码,密度=dpi/160,所以如果屏幕密度为1,1dp=1px,如果为2,则1dp=2px3:sp(scale-independentpixels),字体的推荐单位,可以根据文字的大小进行缩放,官方推荐的最小值为12sp,然后尝试使用偶数。*dpimdpi→[120dpi~160dpi]hdpi→[160dpi~240dpi]xdpi→[240dpi~320dpi]xxdpi→[320dpi~480dpi]xxxdpi→[480dpi~640dpi]比如手机屏幕分辨率480*800,屏幕尺寸3.7中,它的dpi是多少,布局中设置宽度为320dp,宽度是多少像素?理论计算值:先计算对角线像素数480480+800800=933933,再计算每英寸像素数933/3.7=252dpi,最终计算出的dpi为252。计算对应的像素值320dp:首先计算屏幕密度,屏幕密度值相当于1dp对应的像素值:320(252/160)=504px,(手机屏幕只有480px,计算出来的宽度其实比屏幕还宽,如果成立,则说明如果在申诉画面设置为320dp,部分会在画面外)注:手机上计算的DPI是理论值,实际上只有120(low),160(medium),240(high),320(xhigh)等类型,所以实际计算公式为:320(240/160)=480px,与屏幕宽度相同,表示诉求屏幕设置为320dp,正好占据整个屏幕。3、如何适应?以上只是知道为什么和各种概念,那么如何适应呢?这里主要看手机适配,不看平板适配。裁剪规则从上面的概念我们知道在160dpi下1dp=1px,所以在设计图标的时候,(mdpi,hdpi,xhpi,xxhpi,xxhpi)的比例是2:3:4:6:8。比如系统图标,mdpi是4848,那么xdpi是7272,比例是1.5。从上图中的res结构我们可以看到有一个mipmap-*类型的文件夹,是本系统新建的一个放置系统图标的文件夹。各种图标的大小以下是官方推荐的图标大小和宽度值设置。我们先来看看我们是如何在一个界面中设置一个宽度为320dp的view的。从图中可以看出,不同的屏幕显示效果不同(忽略平板)。有些手机占据了整个屏幕宽度,而有些手机只占据了屏幕的一部分宽度。因此,在视觉绘制图片时,比如绘制800*480的尺寸,标签占据了整个屏幕宽度240dp,实际在各个手机上的显示效果会不一致。因此,在开发中,可以使用match_parent来设置整屏。如果是其他尺寸,可以使用adaptive或者weight来设置view占用的宽高。Qualifier从上面我们可以看出*dpi是作为限定符使用的,还有其他的限定符比如largequalifier,swqualifier等等,就不一一展开了。.9图片.9图片表示系统在图片周围添加了一个像素的透明边框,图片必须使用.9作为描述符。比如用一张图片作为背景,如果不是.9的图片,如果内容区域比图标大,图片就会被拉伸。下图的四个角被拉伸了。下图设置了图片的拉伸区域,可以看到图片的四个角都没有拉伸,所以最终的视觉效果要好很多。标记位置:在相邻的两个边上标记。你不能只标记一侧,也不能只标记相对的两侧。如果只标记两侧,则拉伸区域为相交部分,文本区域由右侧和底部控制。如果你不标记它,它将覆盖整个宽度。同时需要注意的是,图片可以分段标注,但图片最终的拉伸效果与标注的像素点有关。比如标记同一边的上下两边,上下像素比例为3:1,那么最终的拉伸比例也是3.:1.4.MoreTipsa:sizeofthesamehdpi、xhdpi等格式的图片应该是成比例的,这样才能在同屏不同分辨率下显示一致。注意上面2:3:4:6:8b:同一个型号,图片的尺寸应该是一样的,可能有多个模组是多人做的,导致同型号之间相差1或2个像素图片裁剪(可以建资源库,反向查看现有图标大小)。c:同一张图的问题,不同的人做出不同的模块,很多图标都是一样的。由于开发不同,一个包内会出现相同的图片,会增加包的体积。d:如果可以使用纯色图片,让开发尽量使用色值,不要裁图。e:与png图片相比,jpg的尺寸会小很多。如果你的图片比较大,而且没有模糊渐变等要求,尽量使用jpg格式。f:很多简单的图片都可以用代码实现,比如圆形,矩形等,可以用代码实现开发,减少包的大小。g:如果包裹尺寸过大,尽量保证有更大尺寸的图片,这样屏幕密度低的手机也能显示很清晰的图片,但是如果只有小图片,会被放大和拉伸,这将导致图片变形或不清晰。h:.9注意标注stretcharea和contentarea,图片外边距的padding,可以直接标注在图片上。(如果内容区域的上下距离不相等,多行文字填充时文字不会居中,此时可以直接在图片上留padding)i:.9图片只能拉伸不能压缩。压缩会导致图片变形,所以在绘制的过程中,需要确定图片的最小尺寸,(比如给定一个一定高度的矩形区域,初始尺寸为.9的图片高度大于矩形放在里面,会造成图片压缩)。j:.9的图片一般只需要做小尺寸,除非边框有渐变等元素,只能做多个尺寸。k:关于图片标注,美工需要转换单位,px转换为对应的dp,开发可以直接使用这个值。l:关于字体,字号sp,但是如果字体显示在固定高度的矩形框内,在可以调节字号的手机上可能显示不全(尽量不要写外置图片字体,背景等死)高)。m:标注图片时,如果图标占满了整个宽度,则不需要标注图标的宽度。你只需要标注离边界的距离的大小。开发将使用自适应。如果确定了宽度,在某些屏幕上只能占据一半的宽度,看到这里,不知道大家对自己的Android开发经验有没有更多的感悟呢~本周二,我们请来了网易云音乐资深移动开发工程师程寅,跟大家分享一下他与移动开发相关的工作心得。
