今日头条的布局和字体适配方式
本文: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英寸=2.54厘米 比如常见的屏幕尺寸有2.4.2.8.3.5.3.7.4.2.5.0.5.5.6.0等 屏幕分辨率 屏幕分辨率是指在 ...
- 深度:今日头条是中老年电商流量新蓝海,2000万中老年日活包含了哪些新商业机会?
目前中国60岁以上人口2.49亿,50岁以上人口4亿,50+上网人群接近9000万,每年新增800-1000万中老年网民,同时中老年群体以每年1500万的速度更新. 随着互联网在中老年群体中渗透率的提 ...
- python 头条号_python爬取今日头条收藏目录
今日头条收藏以异步加载方式加载,可用以下两种方式分析,达到以下效果: 第一种: 将收藏网页拉直最底部,直到不产生新的收藏信息,将网页下载,另存到本地,形成新的htm文件,这时可以用分析静态网页的方式进 ...
- android的今日头条软件怎么删除,如何把今日头条账号注销 退出账号的方法教程[多图]...
今日头条这个软件受到很多朋友用户的喜爱,对于在使用这个软件的时候朋友用户都会先登录账号,但当想要注销账号了怎么办?如何把今日头条账号注销?废话不多说,下面apk3来帮助大家解决今日头条退出账号的方法教 ...
- 今日头条移动APP 广告激活数据API对接实践
自从上班实习之后,就好久没有写博客了,这是自毕业后的第一篇博客,希望自己今后能养成写博客的一个好习惯.最近公司为了加速APP推广,采取在外部平台(如:今日头条)进行广告投放的方式,进行用户引流.因此我 ...
- android 今日头条布局,Android今日头条UI适配完善版
前言 众所周知 android的碎片化一直困扰着开发者,我们要花很多的时间去做UI适配的工作.主流的适配方案有两种 1.今日头条适配 2.smallestWidth适配.具体的实现点击上述连接查看. ...
- 使用今日头条屏幕适配方案时,Android 布局突然错乱
背景: 项目是采用的 今日头条屏幕适配方案 'me.jessyan:autosize:1.2.1' 再运行调试APK到模拟器时,突然出现了该错误,在真机也会出现,不过触发概率都非常小.当退出应用,再次 ...
- 今日头条屏幕适配方案落地研究
目录 前言 各平板数据比较 为什么看起来更小了?(头条方案跟最小宽度方案比较) smallesWidth 方案迁移 优缺点 issue 附录(适配核心代码) 前言 大家好,现在给大家推荐一种极低版本的 ...
- 今日头条屏幕适配终极解决方案,很实用
热文导读| 点击标题阅读 互联网寒冬下,程序员如何突围提升自己? 腾讯新开源一吊炸天神器-零反射全动态Android插件框架正式开源 Flutter:究竟是大势所趋还是昙花一现? 作者:但,我知道 ...
最新文章
- txt或者csv数据文件的格式是有要求的,如下shell代码中说明。
- Visual Studio 出现“无法解析的外部符号”错误
- BIBM系列论文阅读笔记
- python程序员工作怎样-12个Python程序员面试必备问题与答案(小结)
- 开机显示输入最佳预设值_开机密码忘了怎么解决
- PHP的urlencode
- 1.7 编程基础之字符串 27 单词翻转 4分 python
- 华为P30真机屏幕盖板曝光:超窄边框水滴屏
- webstorm与Idea禁用自动保存
- UVA - 10603 Fill(隐式图搜索)
- 从多路搜索树到 B-树
- 22.Linux/Unix 系统编程手册(上) -- 信号:高级特性
- Golang QRCode 生成实现
- 怎么使用biopython_Biopython - 简介
- 韩寒诉百度文库侵权案分析
- X1000对于camera控制部分的翻译
- Effient技术原理
- 无线路由器连接有线路由器
- 怎么旋转PDF文件中的页面
- C语言射击类打飞机小游戏
热门文章
- Ethereum 基础(一)
- 分答项目_知识点:$_GPC[]获取客户端传递的js数组数据
- 李沐精读论文:ViT 《An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale》
- 开源云盘搭建部署 施工中~
- opencv+tesseract完成验证码识别(识别率99.99%)
- 《论语》原文及其全文翻译 学而篇14
- 【学习笔记】数字证书,私钥——公钥
- 金融科技的下一战场:从金融普惠到技术普惠
- 即便到愚人节,也千万别做的恶作剧!
- 单片机开发,常用的一些知识