android字节跳动屏幕适配,Android屏幕适配-第三篇(今日头条适配方案)

更新时间:2023-07-30 13:34:42 阅读: 评论:0

android字节跳动屏幕适配,Android屏幕适配-第三篇(今⽇头
条适配⽅案)
今天记录的笔记是今⽇头条的适配⽅案原理以及开源库”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() {
.tLog(true)什么下奶>北京有名的景点
.
init((Application) getContext().getApplicationContext())
co前缀
.tUDeviceSize(fal);
return true;
}
//其他代码忽略...
}
然后会调⽤此⽅法
AutoSizeConfig init(final Application application, boolean isBaOnWidth, AutoAdaptStrategy strategy) {
Preconditions.checkArgument(mInitDensity == -1, "AutoSizeConfig#init() can only be called once");
Preconditions.checkNotNull(application, "application == null");
this.mApplication = application;
this.isBaOnWidth = isBaOnWidth;
final DisplayMetrics displayMetrics = System().getDisplayMetrics();
getMetaData(application);
isVertical = Resources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
int[] screenSize = ScreenSize(application);
mScreenWidth = screenSize[0];
mScreenHeight = screenSize[1];
mStatusBarHeight = StatusBarHeight();
LogUtils.d("designWidthInDp = " + mDesignWidthInDp + ", designHeightInDp = " + mDesignHeightInDp + ", screenWidth = " + mScreenWidth + ", screenHeight = " + mScreenHeight);
mInitDensity = displayMetrics.density;
mInitDensityDpi = displayMetrics.densityDpi;
mInitScaledDensity = displayMetrics.scaledDensity;
mInitXdpi = displayMetrics.xdpi;
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig != null) {
if (newConfig.fontScale > 0) {
mInitScaledDensity =
LogUtils.d("initScaledDensity = " + mInitScaledDensity + " on ConfigurationChanged");
}
isVertical = ientation == Configuration.ORIENTATION_PORTRAIT;
int[] screenSize = ScreenSize(application);
mScreenWidth = screenSize[0];
mScreenHeight = screenSize[1];
}
}
@Override权杖国王正位
public void onLowMemory() {
}
});
.
...
//注意看这句代码是
mActivityLifecycleCallbacks = new ActivityLifecycleCallbacksImpl(strategy == null ? new WrapperAutoAdaptStrategy(new DefaultAutoAdaptStrategy()) : strategy);
双节棍教程....
return this;
动物的诗}
ActivityLifecycleCallbacksImpl这⾥⾯有很多核⼼代码
/**
* ================================================
* {@link ActivityLifecycleCallbacksImpl} 可⽤来代替在 BaActivity 中加⼊适配代码的传统⽅式
* {@link ActivityLifecycleCallbacksImpl} 这种⽅案类似于 AOP, ⾯向接⼝, 侵⼊性低, ⽅便统⼀管理, 扩展性强, 并且也⽀持适配三⽅库的{@link Activity}
*
* Created by JessYan on 2018/8/8 14:32
* Contact me
重结
* Follow me
* ================================================
*/
public class ActivityLifecycleCallbacksImpl implements Application.ActivityLifecycleCallbacks {
/**
* 屏幕适配逻辑策略类
*/
private AutoAdaptStrategy mAutoAdaptStrategy;
/**
* 让 {@link Fragment} ⽀持⾃定义适配参数
小心的近义词是什么*/
private FragmentLifecycleCallbacksImpl mFragmentLifecycleCallbacks;
public ActivityLifecycleCallbacksImpl(AutoAdaptStrategy autoAdaptStrategy) {
mFragmentLifecycleCallbacks = new FragmentLifecycleCallbacksImpl(autoAdaptStrategy);
mAutoAdaptStrategy = autoAdaptStrategy;
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if (Instance().isCustomFragment()) {
if (activity instanceof FragmentActivity) {
((FragmentActivity)
activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycleCallbacks, true); }
}
//Activity 中的 tContentView(View) ⼀定要在 Create(Bundle); 之后执⾏
if (mAutoAdaptStrategy != null) {
mAutoAdaptStrategy.applyAdapt(activity, activity);
}
}
@Override
public void onActivityStarted(Activity activity) {
if (mAutoAdaptStrategy != null) {
mAutoAdaptStrategy.applyAdapt(activity, activity);
}
}
...
/**
* 设置屏幕适配逻辑策略类
*
* @param autoAdaptStrategy {@link AutoAdaptStrategy}
*/
public void tAutoAdaptStrategy(AutoAdaptStrategy autoAdaptStrategy) {
mAutoAdaptStrategy = autoAdaptStrategy;
mFragmentLifecycleCallbacks.tAutoAdaptStrategy(autoAdaptStrategy);
}
}
DefaultAutoAdaptStrategy⾥⾯⼲了什么事情
/**
* ================================================
* 屏幕适配逻辑策略默认实现类, 可通过 {@link AutoSizeConfig#init(Application, boolean, AutoAdaptStrategy)}
* 和 {@link AutoSizeConfig#tAutoAdaptStrategy(AutoAdaptStrategy)} 切换策略
*
* @e AutoAdaptStrategy
* Created by JessYan on 2018/8/9 15:57
* Contact me
* Follow me
* ================================================
*/
public class DefaultAutoAdaptStrategy implements AutoAdaptStrategy {
@Override
public void applyAdapt(Object target, Activity activity) {
//检查是否开启了外部三⽅库的适配模式, 只要不主动调⽤ ExternalAdaptManager 的⽅法, 下⾯的代码就不会执⾏
if (Instance().getExternalAdaptManager().isRun()) {
if (Instance().getExternalAdaptManager().Class())) {
LogUtils.w(String.format(Locale.ENGLISH, "%s canceled the adaptation!", Class().getName()));
AutoSize.cancelAdapt(activity);
return;
} el {
ExternalAdaptInfo info = Instance().getExternalAdaptManager()
.Class());
if (info != null) {
LogUtils.d(String.format(Locale.ENGLISH, "%s ud %s for adaptation!", Class().getName(), Name()));
AutoSize.autoConvertDensityOfExternalAdaptInfo(activity, info);
return;
}
}

本文发布于:2023-07-30 13:34:42,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1123770.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:适配   屏幕   策略   逻辑   知道   北京
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图