今天记录的笔记是今日头条的适配方案原理以及开源库”AndroidAutoSize“的实现剖析!(备注:此文仅供自己参考,全文全是文字,如果读者读起来比较生涩难懂,建议阅读引入文章)
此篇文章是通过阅读《骚年你的屏幕适配方式该升级了!-今日头条适配方案》理解的整理。感谢作者JessYan
适配的前提是你需要知道安卓适配的基础知识和基本方法 《Android屏幕适配-第一篇(基础知识)》、《Android屏幕适配-第二篇(你要知道的适配基本操作)》
你需要知道的关键字:density、dip、px、dp(dpi)
今日头条适配原理:density=(当前屏幕分辨率宽或高(单位px))/(ui设计稿宽或高(单位dp))
这个表示的是1dp在当前分辨率下的所对于的像素
真正的view大小: realWidth=(ui设计稿上的宽度)*density
如何使用,例子:如设置一个view大小为100dpx100dp,通过上面的公式可得到宽为100*density高为100*density
假设当前分辨率为720x1280,设计搞的尺寸为360x640,当前density=2
假设当前分辨率为480x800,设计搞的尺寸为360x640,当前density=1.333
分辨率为720x1280下 view宽度=100*2 px,占整体宽度的比例为0.278(约等于)
分辨率为480x800下 view宽度=100*1.33 px,占整体宽度的比例为0.278(约等于)
比例近乎相同
AndroidAutoSize分析
设置设计稿 宽或高
初始化配置,通过启动一个ContenProvider来启动默认配置
/**
* ================================================
* 通过声明 {@link ContentProvider} 自动完成初始化
* Created by JessYan on 2018/8/19 11:55
* Contact me
* Follow me
* ================================================
*/
public class InitProvider extends ContentProvider {
@Override
public boolean onCreate() {
AutoSizeConfig.getInstance()
.setLog(true)
.init((Application) getContext().getApplicationContext())
.setUseDeviceSize(false);
return true;
}
//其他代码忽略...
}
然后会调用此方法
AutoSizeConfig init(final Application application, boolean isBaseOnWidth, AutoAdaptStrategy strategy) {
Preconditions.checkArgument(mInitDensity == -1, "AutoSizeConfig#init() can only be called once");
Preconditions.checkNotNull(application, "application == null");
this.mApplication = application;
this.isBaseOnWidth = isBaseOnWidth;
final DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
getMetaData(application);
isVertical = application.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
int[] screenSize = ScreenUtils.getScreenSize(application);
mScreenWidth = screenSize[0];
mScreenHeight = screenSize[1];
mStatusBarHeight = ScreenUtils.getStatusBarHeight();
LogUtils.d("designWidthInDp = " + mDesignWidthInDp + ", designHeightInDp = " + mDesignHeightInDp + ", screenWidth = " + mScreenWidth + ", screenHeight = " + mScreenHeight);