本文:https://www.jianshu.com/p/f1a61baf66a6
原文:一种极低成本的Android屏幕适配方式 - 字节跳动技术团队

文章目录

  • 前言
  • 原文最终方案
  • 如何确保每个Activity的应用
  • 为什么要每个Activity都进行重设
  • 结语
  • 参考文献

前言

屏幕适配啊,老生长谈的问题,因为Android碎片化的原因,屏幕的分辨率简直是五花八门啊,不说别的,打开studio模拟器里就可以搞一大堆不同分辨率的模拟器。

适配是个头疼的事啊,虽然Android官方提供了dp单位来适配,但是在某些时候特殊的屏幕分辨率下,UI还是变形的难看的不行。

下面说一种字节跳动技术团队提供的适配方式,据说是今日头条中使用的方式。

详细的信息大家直接去看原文吧,链接如下:
原文:一种极低成本的Android屏幕适配方式 - 字节跳动技术团队

原文最终方案

我这里呢,就把原文里面实现的代码最终方案敲了一下,方便大家参阅。
同时在 Activity#onCreate 方法中调用下就行了。

    // 适配private static float sNonCompatDensity;private static float sNonCompatScaledDensity;// 默认设计图为360dpprivate final static float TARGET_SCREEN_WIDTH_DP = 360;private static void setCustomDensity(@NonNull Activity activity, @NonNull final Application application) {final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();if (sNonCompatDensity == 0) {sNonCompatDensity = appDisplayMetrics.density;sNonCompatScaledDensity = appDisplayMetrics.scaledDensity;application.registerComponentCallbacks(new ComponentCallbacks() {@Overridepublic void onConfigurationChanged(Configuration newConfig) {if (newConfig != null && newConfig.fontScale > 0) {sNonCompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;}}@Overridepublic void onLowMemory() {}});}final float targetDensity = appDisplayMetrics.widthPixels / TARGET_SCREEN_WIDTH_DP;final float targetScaledDensity = targetDensity * (sNonCompatScaledDensity / sNonCompatDensity);final int targetDensityDpi = (int) (160 * targetDensity);appDisplayMetrics.density = targetDensity;appDisplayMetrics.scaledDensity = targetScaledDensity;appDisplayMetrics.densityDpi = targetDensityDpi;final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();activityDisplayMetrics.density = targetDensity;activityDisplayMetrics.scaledDensity = targetScaledDensity;activityDisplayMetrics.densityDpi = targetDensityDpi;}
}

如何确保每个Activity的应用

在使用过程中,因为发现项目中存在不少未继承Base类的Activity,这就尴尬了。
觉得去找每一个Activity的onCreate又不太现实,这里想到了一个其它方式。

ActivityLifecycleCallbacks
Application 中通过 registerActivityLifecycleCallbacks 监听Activity的生命周期,并在onCreate中设置适配。


public class DemoApplication extends Application {private static DemoApplication mApplication = null;@Overridepublic void onCreate() {super.onCreate();mApplication = this;...registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {// 修改适配信息setCustomDensity(activity,mApplication);}@Overridepublic void onActivityStarted(Activity activity) { }@Overridepublic void onActivityResumed(Activity activity) { }@Overridepublic void onActivityPaused(Activity activity) { }@Overridepublic void onActivityStopped(Activity activity) { }@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) { }@Overridepublic void onActivityDestroyed(Activity activity) { }});}private static void setCustomDensity( ... ) { ... }}

为什么要每个Activity都进行重设

主要和 Resource 的创建有关。
我这里先简单说一下,详细可以翻阅资料,或者以后有时间在做个 Resource 相关的文章。

每个Activity的Resource资源是独立的,并且有缓存。
在Activity启动的时候,根据activityToken,overrideConfig等关键信息去更新或者重新生成Resource放入缓存种以供使用。
而我们目前适配的方式,更改的只是某个Resource对象,不是全部,即使是全部的,也存在一个Resource可能被更新的问题。所以才需要每个Activity中都进行设置。

结语

有什么不对的地方,欢迎大家指正。

参考文献

本文:https://blog.csdn.net/CrazyApes/article/details/117136453
原文:一种极低成本的Android屏幕适配方式 - 字节跳动技术团队
参考:https://developer.android.google.cn/guide/practices/screens_support

今日头条的布局和字体适配方式相关推荐

  1. 屏幕适配方式都有哪些

    基本概念: 屏幕尺寸 屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米 比如常见的屏幕尺寸有2.4.2.8.3.5.3.7.4.2.5.0.5.5.6.0等 屏幕分辨率 屏幕分辨率是指在 ...

  2. 深度:今日头条是中老年电商流量新蓝海,2000万中老年日活包含了哪些新商业机会?

    目前中国60岁以上人口2.49亿,50岁以上人口4亿,50+上网人群接近9000万,每年新增800-1000万中老年网民,同时中老年群体以每年1500万的速度更新. 随着互联网在中老年群体中渗透率的提 ...

  3. python 头条号_python爬取今日头条收藏目录

    今日头条收藏以异步加载方式加载,可用以下两种方式分析,达到以下效果: 第一种: 将收藏网页拉直最底部,直到不产生新的收藏信息,将网页下载,另存到本地,形成新的htm文件,这时可以用分析静态网页的方式进 ...

  4. android的今日头条软件怎么删除,如何把今日头条账号注销 退出账号的方法教程[多图]...

    今日头条这个软件受到很多朋友用户的喜爱,对于在使用这个软件的时候朋友用户都会先登录账号,但当想要注销账号了怎么办?如何把今日头条账号注销?废话不多说,下面apk3来帮助大家解决今日头条退出账号的方法教 ...

  5. 今日头条移动APP 广告激活数据API对接实践

    自从上班实习之后,就好久没有写博客了,这是自毕业后的第一篇博客,希望自己今后能养成写博客的一个好习惯.最近公司为了加速APP推广,采取在外部平台(如:今日头条)进行广告投放的方式,进行用户引流.因此我 ...

  6. android 今日头条布局,Android今日头条UI适配完善版

    前言 众所周知 android的碎片化一直困扰着开发者,我们要花很多的时间去做UI适配的工作.主流的适配方案有两种 1.今日头条适配 2.smallestWidth适配.具体的实现点击上述连接查看. ...

  7. 使用今日头条屏幕适配方案时,Android 布局突然错乱

    背景: 项目是采用的 今日头条屏幕适配方案 'me.jessyan:autosize:1.2.1' 再运行调试APK到模拟器时,突然出现了该错误,在真机也会出现,不过触发概率都非常小.当退出应用,再次 ...

  8. 今日头条屏幕适配方案落地研究

    目录 前言 各平板数据比较 为什么看起来更小了?(头条方案跟最小宽度方案比较) smallesWidth 方案迁移 优缺点 issue 附录(适配核心代码) 前言 大家好,现在给大家推荐一种极低版本的 ...

  9. 今日头条屏幕适配终极解决方案,很实用

    热文导读|   点击标题阅读 互联网寒冬下,程序员如何突围提升自己? 腾讯新开源一吊炸天神器-零反射全动态Android插件框架正式开源 Flutter:究竟是大势所趋还是昙花一现? 作者:但,我知道 ...

最新文章

  1. txt或者csv数据文件的格式是有要求的,如下shell代码中说明。
  2. Visual Studio 出现“无法解析的外部符号”错误
  3. BIBM系列论文阅读笔记
  4. python程序员工作怎样-12个Python程序员面试必备问题与答案(小结)
  5. 开机显示输入最佳预设值_开机密码忘了怎么解决
  6. PHP的urlencode
  7. 1.7 编程基础之字符串 27 单词翻转 4分 python
  8. 华为P30真机屏幕盖板曝光:超窄边框水滴屏
  9. webstorm与Idea禁用自动保存
  10. UVA - 10603 Fill(隐式图搜索)
  11. 从多路搜索树到 B-树
  12. 22.Linux/Unix 系统编程手册(上) -- 信号:高级特性
  13. Golang QRCode 生成实现
  14. 怎么使用biopython_Biopython - 简介
  15. 韩寒诉百度文库侵权案分析
  16. X1000对于camera控制部分的翻译
  17. Effient技术原理
  18. 无线路由器连接有线路由器
  19. 怎么旋转PDF文件中的页面
  20. C语言射击类打飞机小游戏

热门文章

  1. Ethereum 基础(一)
  2. 分答项目_知识点:$_GPC[]获取客户端传递的js数组数据
  3. 李沐精读论文:ViT 《An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale》
  4. 开源云盘搭建部署 施工中~
  5. opencv+tesseract完成验证码识别(识别率99.99%)
  6. 《论语》原文及其全文翻译 学而篇14
  7. 【学习笔记】数字证书,私钥——公钥
  8. 金融科技的下一战场:从金融普惠到技术普惠
  9. 即便到愚人节,也千万别做的恶作剧!
  10. 单片机开发,常用的一些知识