一、传统适配方案

所谓传统适配方案即在不同的layout和drawable文件加下放置不同的资源文件,由系统自动选择使用合适的文件,实现适配。

这种方案的大致过程是:设计人员在某个dpi下完成图的设计,标注单位为px,然后开发人员使用相同的dpi将px转化为dp单位,再通过倍数扩展完成其他dpi下的界面适配。

整个过程是围绕着dpi进行的,dpi即屏幕密度,单位英寸面积上的像素点数。在iphone上用的是ppi,跟安卓上的dpi是一样的。手机的屏幕分辨率一般是x英寸*y英寸,屏幕尺寸一般用对角线尺寸,即z寸,有了这两个数据就可以算出dpi,公式为:

android dpi androiddpi适配_屏幕密度


针对不同的dpi会有多个资源文件夹,对应的layout和drawable文件夹有layout-ldpi、layout-mdpi、layout-hdpi、layout-xhdpi、layout-xxhdpi和drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi。这里120为ldpi,160为mdpi,240为hdpi,320为xhdpi,480为xxhdpi,在两个值之间的dpi可以归为下界值的dpi,即120-160为ldpi。如果图片放在了drawable中,等同于放在drawable-mdpi中,因为drawable目录不具有屏幕密度特性,所以采用基准值,即mdpi。如果设备的屏幕密度高于当前drawable目录所代表的密度,则图片会被放大,否则会被缩小。放大或缩小比例 = 设备屏幕密度 / drawable目录所代表的屏幕密度。dp能让相同dpi,不同分辨率、不同尺寸的屏幕显示出相同英寸大小;不同的dpi就要设置不同的dp。针对一款手机,有了dpi,就可以针对这个dpi做UI,UI的单位是像素。他们的换算关系是:

dp=px/(dpi / 160)

先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出。例如在160dpi下完成设计,由设计的px转为dp,然后在其他dpi下通过比例缩放完成dp的扩展,ldpi、mdpi、hdpi、xhdpi、xxhdpi的比例是0.75:1:1.5:2:3。之所以选择在160dpi下dp=px,是因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。

通常某个分辨率下的手机会在某个屏幕尺寸范围内,所以通常会有某些尺寸的手机或者某些dpi的手机属于某类dpi。如下图:

android dpi androiddpi适配_屏幕密度_02

某个分辨率一般有个默认屏幕尺寸,不会偏差太大,所以可以认为dpi和分辨率是对应固定的。
至于sp,我们默认都是sp=dp的。
最后,还可以通过在manifest设置屏幕支持类型,代码如下:

<supports-screens android:resizeable=["true"| "false"]
android:smallScreens=["true" | "false"]   //是否支持小屏
android:normalScreens=["true" | "false"]  //是否支持中屏
android:largeScreens=["true" | "false"]   //是否支持大屏
android:xlargeScreens=["true" | "false"]  //是否支持超大屏
android:anyDensity=["true" | "false"]    //是否支持多种不同密度的屏幕
android:requiresSmallestWidthDp=”integer”
android:compatibleWidthLimitDp=”integer”
android:largestWidthLimitDp=”integer”/>

二、按照百分比适配

  1. 在安卓中常用的比例适配方法如:
  • 在layout中使用match_parent、wrap_content、layout_weight。
  • 多使用自定义控件,因为自定义控件中onMeasure都是针对传进来的长宽做百分比计算。
  1. 布局的百分比适配
    具体做法就是按照屏幕的宽高的百分比设置控件的大小,能做到更好的适配。
  • 可以使用Google的android-percent-support-lib库,提供的布局有PercentRelativeLayout和PercentFrameLayout。支持的属性有layout_widthPercent、layout_heightPercent、layout_marginPercent、layout_marginLeftPercent、layout_marginTopPercent、layout_marginRightPercent、layout_marginBottomPercent、layout_marginStartPercent、layout_marginEndPercent。
    关于使用android-percent-support-lib库和自定义PercentLinearLayout可以查看鸿洋_的博客。
  • 由于上面这个库使用上有些不够方便,所以鸿洋_提供了一个更为简洁的百分比布局的类库AndroidAutoLayout,提供的布局包括LinearLayout -> AutoLinearLayout、RelativeLayout -> AutoRelativeLayout、FrameLayout -> AutoFrameLayout。支持的属性有layout_width、layout_height、layout_margin(left,top,right,bottom)、pading(left,top,right,bottom)、textSize。具体的使用和源码解析可以参阅

总结:在做适配时的执行顺序可以是
如果允许使用第三方库的话当然先使用AndroidAutoLayout或者android-percent-support-extend。
如果不允许使用的话, 尽量使用百分比布局前四条建议。
如果百分比适配不能解决所有问题,只能用传统方法了。