阅读:
Android 目前稳定高效的UI适配方案
https://mp.weixin.qq.com/s/X-aL2vb4uEhqnLzU5wjc4Q

前言:

不管你在布局文件中填写的是什么单位,最后都会被转化为 px,系统就是通过上面的方法,将你在项目中任何地方填写的单位都转换为 px 的。pxdp 的公式 dp = px / density,就是根据上面的方法得来的,density 在公式的运算中扮演着至关重要的一步。

要看懂下面的内容,还得明白,今日头条的适配方式,今日头条适配方案默认项目中只能以高或宽中的一个作为基准,进行适配,为什么不像 AndroidAutoLayout 一样,高以高为基准,宽以宽为基准,同时进行适配呢?

这就引出了一个现在比较棘手的问题,大部分市面上的 Android 设备的屏幕高宽比都不一致,特别是现在大量全面屏的问世,这个问题更加严重,不同厂商推出的全面屏手机的屏幕高宽比都可能不一致。

这时我们只以高或宽其中的一个作为基准进行适配,就会有效的避免布局在高宽比不一致的屏幕上出现变形的问题。

明白这个后,我再来说说 densitydensity 在每个设备上都是固定的,DPI / 160 = density屏幕的总 px 宽度 / density = 屏幕的总 dp 宽度

  • 设备 1,屏幕宽度为 1080px480DPI,屏幕总 dp 宽度为 1080 / (480 / 160) = 360dp

  • 设备 2,屏幕宽度为 1440560DPI,屏幕总 dp 宽度为 1440 / (560 / 160) = 411dp

可以看到屏幕的总 dp 宽度在不同的设备上是会变化的,但是我们在布局中填写的 dp 值却是固定不变的

这会导致什么呢?假设我们布局中有一个 View 的宽度为 100dp,在设备 1 中 该 View 的宽度占整个屏幕宽度的 27.8% (100 / 360 = 0.278)

但在设备 2 中该 View 的宽度就只能占整个屏幕宽度的 24.3% (100 / 411 = 0.243),可以看到这个 View 在像素越高的屏幕上,dp 值虽然没变,但是与屏幕的实际比例却发生了较大的变化,所以肉眼的观看效果,会越来越小,这就导致了传统的填写 dp 的屏幕适配方式产生了较大的误差

这时我们要想完美适配,那就必须保证这个 View 在任何分辨率的屏幕上,与屏幕的比例都是相同的

这时我们该怎么做呢?改变每个 Viewdp 值?不现实,在每个设备上都要通过代码动态计算 Viewdp 值,工作量太大

如果每个 Viewdp 值是固定不变的,那我们只要保证每个设备的屏幕总 dp 宽度不变,就能保证每个 View 在所有分辨率的屏幕上与屏幕的比例都保持不变,从而完成等比例适配,并且这个屏幕总 dp 宽度如果还能保证和设计图的宽度一致的话,那我们在布局时就可以直接按照设计图上的尺寸填写 dp

屏幕的总 px 宽度 / density = 屏幕的总 dp 宽度

在这个公式中我们要保证 屏幕的总 dp 宽度设计图总宽度 一致,并且在所有分辨率的屏幕上都保持不变,我们需要怎么做呢?屏幕的总 px 宽度 每个设备都不一致,这个值是肯定会变化的,这时今日头条的公式就派上用场了

当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = density

这个公式就是把上面公式中的 屏幕的总 dp 宽度 换成 设计图总宽度,原理都是一样的,只要 density 根据不同的设备进行实时计算并作出改变,就能保证 设计图总宽度 不变,也就完成了适配

1. 今日头条屏幕适配:AndroidAutoSize

通过修改density值,强行把所有不同尺寸分辨率的手机的宽度dp值改成一个统一的值(在清单文件中定义),这样就解决了所有的适配问题。

其适配方案的核心原理在于,根据以下公式算出 density (density 的意思就是 1 dp 占当前设备多少像素);

Density的计算:

Density = 当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) ;

今日头条的AutoSize屏幕适配框架:

今日头条的AutoSize屏幕适配框架,是一个极低成本的 Android 屏幕适配方案

https://github.com/JessYanCoding/AndroidAutoSize

使用:

implementation 'me.jessyan:autosize:1.1.2'

AndroidManifest.xml清单文件:

<manifest><application>  <meta-data android:name="design_width_in_dp" android:value="360"/><meta-data android:name="design_height_in_dp" android:value="640"/>   </application>
</manifest>

2.smallestWidth方式适配

详情见:

https://mp.weixin.qq.com/s/X-aL2vb4uEhqnLzU5wjc4Q

以上两种方案我个人感觉 AndroidAutoSize 框架所以用的今日头条适配技术 侵入性比 SmallestWidth要低些,以后如果要更改适配方式比较方便, 使用 SmallestWidth 方案的话以后更该维护起来比较费劲(这纯属与个人看法,如有得罪的地方请海涵,毕竟偶还是个小白)

今日头条屏幕适配方案终极版:

https://github.com/JessYanCoding/AndroidAutoSize

今日头条屏幕适配方案相关推荐

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

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

  2. 今日头条屏幕适配方案终极版正式发布!

    原文地址: juejin.im/post/5bce68- 以下是 骚年你的屏幕适配方式该升级了! 系列文章,欢迎转发以及分享: 骚年你的屏幕适配方式该升级了!(一)-今日头条适配方案 骚年你的屏幕适配 ...

  3. android 最新头条适配,今日头条屏幕适配方案终极版正式发布!

    以下是 骚年你的屏幕适配方式该升级了! 系列文章,欢迎转发以及分享: 前言 我在前面两篇文章中详细介绍了 今日头条适配方案 和 SmallestWidth 限定符适配方案 的原理,并验证了它们的可行性 ...

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

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

  5. 《转》Android 今日头条屏幕适配方案终极版正式发布!

    概述 Android系统发布十多年以来,关于Android的UI的适配一直是开发环节中最重要的问题,但是我看到还是有很多小伙伴对Android适配方案不了解. 刚好,近期准备对糗事百科Android客 ...

  6. 今日头条适配方案_今日头条屏幕适配方案AutoSize实践

    实际上这个这个框架在Github上已经做了很多的解释性语言了,我在这里也就不多此一举了,这里我就简单的介绍一下如何使用以及实践了,首先介绍一下Github库: https://github.com/J ...

  7. 今日头条Android适配方案,android 今日头条的屏幕适配理解

    前一段时间无意中看到今日头条的适配方案,使用到项目中,感觉真的是无比丝滑.所以特意写一篇文章分享给小伙伴们! 本文知识点: 为什么要做屏幕适配 今日头条的适配方案(划重点) 今日头条的适配方案的一些问 ...

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

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

  9. Android屏幕适配框架-(今日头条终极适配方案)

    2019独角兽企业重金招聘Python工程师标准>>> 在Android开发中,屏幕适配是一个非常头痛的问题,因而为了去进行屏幕适配,作为程序员,是呕心沥血,历经磨难,哈哈 我们之前 ...

最新文章

  1. JSON 列转行的一小段无用代码
  2. 1.2.1 算法的基本概念
  3. 【问链-区块链基础知识系列】 第十五课 数字货币交易所的前世、今生和未来(二)
  4. 安营扎寨【我与51CTO的故事】
  5. unittest单元测试笔记
  6. 亲热接触Redis-第一天
  7. Flask消息闪现及日志记录
  8. c 程序设计语言西电科大,西安电子科技大学
  9. 公安部起草《“十三五”平安中国建设规划》并公开征求意见
  10. 《Effective Python 2nd》 读书笔记
  11. 微软要解决癌症问题?
  12. CURL不能访问 但浏览器可以访问
  13. python怎么写代码求年华收益率_如何计算年化收益率?
  14. 问题:所有播放器打开均提示网络加载失败,有时候浏览器还打不开网页
  15. ollydbg(避坑-1) jiack 无法作为一个实时调试器附加到进程 解决方案
  16. 比伯女友首谈私生子事件 挺男友:事实胜于诡辩
  17. 计算机自定义桌面设置在哪里设置,如何在windows10桌面设置自定义图片?查看方法...
  18. mysql统计分数段人数_mysql 按分数段,每个专业分数段统计人数
  19. 如何写好一篇伪原创文章
  20. CAD图纸显示不全?别慌,有浩辰CAD!

热门文章

  1. 计算机毕业设计Java飞机订票管理系统(源码+系统+mysql数据库+lW文档)
  2. Scala:Scaladoc的生成方法
  3. java 进程名_修改java进程名称
  4. golang:实现类似tailf命令的功能
  5. 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)
  6. Backspace长按不能删除,按一下只能删除一个字符
  7. Android 模拟器如何安装apk以及如何解决无法安装的问题
  8. html 像素 视频教程,canvas像素点操作之视频绿幕抠图
  9. Java学习笔记——正则表达式(Pattern类、Matcher类和PatternSyntaxException)
  10. android 新闻栏目管理(可拖动排序的gridview)