本文主要介绍Android界面适配的相关内容,适合1-3年Android开发工程师阅读。1、为什么要适配?让我们从一组统计数据和图表开始。[2015年设备分布图][2016年设备分布图][设备品牌分布][屏幕尺寸分布图][系统分布图][与iOS对比]从以上几张图我们可以看出安卓设备很多,品牌也很多.屏幕尺寸较多,系统版本分布比较大,碎片化严重。这就是android需要适配的原因。另外android的适配包括系统版本的适配,屏幕尺寸的适配等等。2、关于适配各种概念单位px(pixel):像素,屏幕上的点,最小的独立显示单位,px为整数,无小数。一般方格行像素指的是中的链接:表示英寸,每英寸相当于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.7in,它的dpi是多少,宽度在布局中设置为320dp,宽度是多少像素?理论计算值:先计算对角线像素点数480*480+800*800=933933,再计算每英寸像素点数933/3.7=252dpi,最终计算出的dpi为252。计算320dp对应的像素值:首先计算屏幕密度,屏幕密度值相当于1dp对应的像素值:320*(252/160)=504px,(手机屏幕只有480px,计算出来的width实际上是比屏幕宽,如果为true,表示如果在申诉屏设置为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.更多Tips同一张图片的尺寸在hdpi、xhdpi等必须成比例,这样才能在同屏不同分辨率下显示一致。注意上面2:3:4:6:8是同一个型号,图片大小应该是一样的,可能会有多人做的多个模组,导致图片之间相差1、2个像素删除了同类型的图片(可以建个资源库,查看已经带图标大小)。同样的图片问题,不同的人做出不同的模块,很多图标都是一样的。由于开发不同,一个包内会出现相同的图片,会增加包的体积。如果可以使用纯色图片,让开发尽量使用色值,不要裁图。与png图片相比,jpg的尺寸会小很多。如果你有一个大图像并且没有模糊的渐变,请尝试使用jpg格式。很多简单的图片都可以用代码实现,比如圆形,矩形等,可以用代码实现开发,减少包的大小。如果包太大,尽量保证有更大尺寸的图片,这样屏幕密度低的手机也能显示很清晰的图片,但是如果只有小图片,会被放大拉长,这将导致图片变形或不清晰。.9注意标注stretcharea和contentarea,图片外边距的padding,可以直接标注在图片上。(如果内容区域的上下距离不相等,多行文字填充时文字不会居中,这时候可以直接在图片上留padding。)9.图片可以只能拉伸不能压缩。压缩会导致图片变形。在绘制过程中,要确定图片的最小尺寸,(比如给定一个一定高度的矩形区域,在里面放一张初始高度大于矩形的.9图片,会导致图片压缩)。.9图片一般只能做小尺寸,除非边框有渐变等元素,可以做多种尺寸。关于图片标注,art需要进行单位转换,px转换为对应的dp,开发可以直接使用这个值。关于字体,字号sp,但是如果字体显示在一个固定高度的矩形框内,在可以调整字号的手机上可能显示不全(显示字体、背景等的外图).尽量不要写死高度)。标记图片时,如果图标占满了整个宽度,则不需要标记图标的宽度。您只需要从边框标记尺寸。开发将使用自适应。如果确定了宽度,在某些屏幕上只能占据一半的宽度。看到这里,不知道你是不是对自己的Android开发经历有了更多的感悟。【本文为专栏作者“stormzhang”原创稿件,转载请联系原作者(微信ID:googdev)】点此查看该作者更多好文
