摘要: 对使用市面上的适配方案进行总结,并分析大致原理
基本概念了解
1dp 等于 1/160 英寸(in)
Dp用于解决同尺寸下不同分辨率的显示问题,不同尺寸无法解决
常用模拟器的设计稿尺寸:
屏幕dp宽度:375dp-788dp
屏幕尺寸:5.6in
分辨率:1125 x 2436
屏幕适配的方案
适配方案一:通过修改density(或者xdpi)进行适配
存在的问题:原理需要根据设计稿的基础尺寸,进行百分比适配,设计稿View宽度/设计稿总宽度
dp最终转成px进行显示,假设View宽度是100dp,由于100dp是写死的
假设设计稿宽度是400dp,那么100dp宽度的View,占据屏幕的1/4
如果其他三方库的设计稿宽度是300dp,那么100dp宽度View,占据屏幕1/3
三方控件的View的设计稿与app设计稿不一致,会出现问题
解决方案
1.每个Activity,Fragment灵活配置density
成熟的开源框架(感谢): AndroidAutoSize AndroidUtilCode
AndroidAutoSize
项目地址:AndroidAutoSize
参考文档:AndroidAutoSize
AndroidAutoSize原理分析:
- 通过ContentProvdier进行框架的自启动,需要注意框架中有默认的x,w
- 对使用ActivityLifeCycleCallback 对每个Activity进行处理
- 核心原理:density = 屏幕宽度px/设计稿宽度dp ,而根据公式 PX = density * DP
PX = 屏幕宽度px * (DP/设计稿宽度dp)
使用的还是dp单位,对于不需要适配的界面,再进行还原
Blankj 的pt适配方案(个人暂时不会使用)
AndroidUtilCode
使用的是单位pt,只是借用了pt的公式,跟pt本身并无关系
以横轴为例,xdpi是横轴每英寸像素点个数
- 核心原理利用PT公式 PX = (xdpi * value) / 72
- 对每英寸像素点进行重新赋值 xdpi = (屏幕总像素 / 设计稿总的宽度) * 72
- 代入公式,控件View的宽度 = (屏幕总像素 / 设计稿总的宽度) * value
本质上还是百分比换算,对于旧的项目有很好的支持,无需调整,新项目能直接用
个人觉得,因为只是借用了pt的公式,设置View的尺寸,view的尺寸跟pt这个概念没什么关系,后续维护起来会出现概念问题,因为使用大量的pt单位,如果放弃此方法,还是会需要大量修改单位,高度耦合,使用慎重
smallest width 限定符适配方案(使用简单,较为完善)
通过资源限定符号,进行适配,分辨率适配升级版,拓宽了使用范围
在res 建立 values-sw360dp文件夹
系统才有的是向下兼容方式: 手机屏幕400dp,但代码中只有sw380dp,跟sw410dp文件夹,手机不会选择就近,而是选择sw380dp文件,如果没有sw380dp,就会选择默认values中的尺寸
缺点:
- 会生成多个sw文件夹,对于没有完全对应的尺寸,会有相对误差
- 布局中的尺寸,都需要引入dimens中数据,没有数据就无法使用,侵入性强
修改其他适配方案,只需要保留默认的dimens文件,删除其他文件即可,没有迁移成本
使用简单,一键生成,Plugins 插件库中,搜索ScreenMatch,一键生成
通过分辨率去适配(弃用)
来自2015年的适配方案,屏幕会选择对应的分辨率,通过转成对应的px像素点,原理是百分比
Android 屏幕适配方案_android 适配-CSDN博客-鸿洋(弃用)
总结:推荐使用AndroidAutoSize(入侵小,改动小) 或者 smallestWidth(稳定!)
参考文档:
AndroidAutoSize博客
字节开源原理density
Android 屏幕适配终结者 | Blankj’s Blog