2015.8.4 更新:
增加参数custom:autoScaleType 设置缩放模式,可以设为“fitWidth”,"fitHeigth" 和 "fitInside"。分别代表缩放至宽度匹配,缩放至高度匹配以及缩放至适合容器内部,默认为"fitInside"。
做过安卓开发的都知道,屏幕适配是一件非常困难的事情。
Google官方的解决方案: screens_support 需要写多个layout文件以及dimens.xml,工作量大不说,维护也麻烦。实现原理:
原理类似我们用播放器看视频的时候,无论怎么调整窗口大小,播放器都可以自动调整视频大小适合窗口大小。因为视频有一个原始分辨率,播放器会根据窗口实际大小对视频进行缩放。
我们写布局的时候一般是根据某个基准分辨率来(比如UI给的原型图),自动缩放布局的作用就是将这个基准布局乘以一个缩放比例,达到适配所有分辨率的目的。
计算缩放比例公式: 实际大小 / 设计大小 = 缩放比例
只需要给定一个设计大小,就可以计算出缩放比例,然后将布局内部所有元素的尺寸都乘以这个缩放比例,就可以适配实际屏幕了。
替换布局:
只需要替换需要缩放的根布局即可,内部子布局会自动缩放
原布局 | 自动缩放布局 |
---|---|
RelativeLayout | ASRelativeLayout |
LinearLayout | ASLinearLayout |
FrameLayout | ASFrameLayout |
xmlns:custom="http://schemas.android.com/apk/res-auto"
custom:designWidth="384dp"
custom:designHeight="575dp"
custom:autoScaleEnable="true"
custom:autoScaleType="fitInside"
designWidth和designHeight就是你在可视化编辑xml时使用的屏幕大小。比如我使用的是Nexus 4,屏幕尺换算成dp就是384dp和575dp(减去状态栏和操作栏)
autoScaleEnable 用来开启和关闭自动缩放,默认开启
autoScaleType 设置缩放模式,可以设为“fitWidth”,"fitHeigth" 和 "fitInside"。分别代表缩放至宽度匹配,缩放至高度匹配以及缩放至适合容器内部,默认为"fitInside"。
注意事项:
1.designWidth和designHeight非常重要,千万不要填错,否则缩放出来就不是你想要的效果了。
2.如果designWidth和designHeight的单位是dp,那么所有内部子view的单位都必须是dp,不能写px、pt等其他单位。文字大小也不能用sp。如果你想无脑照抄UI给出的像素值,就全部单位用px就可以了。
3.AutoScalingLayout缩放时会保持deginWidth和designHeight的纵横比,不用担心正方形变矩形。
以sample中的 activity_login_dp.xml 为例
未使用AutoScalingLayout
使用AutoScalingLayout