#重要概念
屏幕尺寸
手机对角线的物理尺寸,单位英寸。
常见的有:5寸、5.5寸、6寸等
屏幕分辨率
手机在横向、纵向上的像素点数总和,单位px。
常见的有:1080x1980、720x1280/480x800等
屏幕像素密度
每英寸的像素点数,单位dpi。
密度类型 | 代表分辨率(px) | 屏幕像素密度(dpi) |
---|---|---|
低密度(ldpi) | 240x320 | 120 |
中密度(mdpi) | 320x480 | 160 |
高密度(hdpi) | 480x800 | 240 |
超高密度(xhdpi) | 720x1280 | 320 |
超超高密度(xxhdpi) | 1080x1920 | 480 |
密度无关像素
Android特有的单位,与终端上的实际物理像素点无关。单位dp。
密度类型 | 代表分辨率(px) | 屏幕密度(dpi) | 换算(px/dp) | 比例 |
---|---|---|---|---|
低密度(ldpi) | 240x320 | 120 | 1dp=0.75px | 3 |
中密度(mdpi) | 320x480 | 160 | 1dp=1px | 4 |
高密度(hdpi) | 480x800 | 240 | 1dp=1.5px | 6 |
超高密度(xhdpi) | 720x1280 | 320 | 1dp=2px | 8 |
超超高密度(xxhdpi) | 1080x1920 | 480 | 1dp=3px | 12 |
独立比例像素
Android特有的单位,可根据字体大小首选项进行缩放
dp适配方案
我们以设计图为720x1280分辨率为例(有的公司设计直接给的iPhone 6 750x1344,可近视为等同)。
如上图,720px的设计图,dp = px/2,也就是说;如果你测量到UI设计图上的距离是100px,那么你代码里应该写dp_50。
PS:这里推荐一个小工具,PxCook。可以根据设计的psd图做测量,Android、IOS都可以,而且会根据设计图的分辨率自动转换(就是说 你把720x1280的设计图丢进去,100px的距离测量出来就是50dp了哦)。
第一步:综上,代码里的距离要写对,一般以720x1280为基准,当然也可以根据公司情况调整
第二步:在根据基准分辨率在values/dimens.xml中编写一套我们常用的dimens.xml(个别特殊需求可以再加)。
第三步:根据这个基准,制作出不同宽度的dimens.xml
PS:这里有个AS小插件介绍下,ScreenMatch。在Setting - Plugs里下载,可以在screenMatch.properties中进行配置,base_dp=360 配置基准的dp,默认的360就是720x1280了。然后在module中右键 - ScreenMatch即可自动生成其他不同宽度的dimens.xml
手机 平板 适配方案
Android 3.2 之后引入最小宽度限定符,可以用来做不同的手机 平板做适配。
//默认
res/layout/main.xml
//适配宽度大于600dp的屏幕(大概7寸的平板)
res/layout-sw600dp/main.xml
屏幕方向限定符,可以从来做不同手机 平板横竖屏时的布局匹配(结合最小宽度限定符)
//默认
res/values/layouts.xml
//宽度大于600dp,横屏
res/values-sw600dp-land/layouts.xml
//宽度大于600dp,竖屏
res/values-sw600dp-port/layouts.xml
PS:最小宽度限定只能在Android3.2之后的版本使用,可以准确的为多种宽度的屏幕做适配。在Android3.2之前只有large来统一适配大于600dp的大屏手机或平板
适配细节
- 禁用绝对布局AbsoluteLayout
- mipmap相对drawable加载性能会更好些
- 合理利用"wrap_content"、“match_parent”、"weight“、“weightSum”来控制视图组件的宽度和高度
- 图片适配可以采用9png方案(直接修改png图片的后缀为.9.png,然后在AS中直接进行设置。千万不要右键 Create 9-patch file,不要问我为什么…)
- 控件之间或者控件大小尽量设置间距,不要直接设置宽高。
- 适当引入百分比布局库