香港最快开奖现场直播,彩霸王论坛,www.296666.com,手机看开奖23344开奖网
彩霸王论坛

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

发布日期:2019-09-22 07:35   来源:未知   阅读:

  我在前面两篇文章中详细介绍了今日头条适配方案SmallestWidth 限定符适配方案的原理,并验证了它们的可行性,以及总结了它们各自的优缺点,可以说这两个方案都是目前比较优秀、比较主流的

  但是对于一些才接触这两个方案的朋友,肯定或多或少还是不知道如何选择这两个方案,我虽然在之前的文章中给出了它们各自的优缺点,但是并没有用统一的标准对它们进行更细致的对比,所以也就没办法更形象的体现它们的优劣,那下面我就用统一的标准对它们进行对比,看看它们的对比情况

  我始终坚定地认为在这两个方案中,并不能以单个标准就能评判出谁一定比谁好,因为它们都有各自的优缺点,都不是完美的,从更客观的角度来看,它们谁都不能成为最好的那个,只有可能明确了它们各自的优缺点,知道在它们的优缺点里什么是我能接受的,什么是我不能接受的,是否能为了某些优点做出某些妥协,从而选择出一个最适合自己项目的屏幕适配方案

  单纯的争论谁是最好的Android屏幕适配方案没有任何意义,每个人的需求不一样,站的角度不一样,评判标准也不一样,你能接受的东西他不一定能接受,你觉得不可接受的东西他却觉得可以接受,你有你的理由,他有他的理由,想让一个观点让所有人都能接受太难了!所以我在这里只是列出它们的对比项和对比结果,尽可能的做到客观,最后的选择结果请自行决定,如果还有什么遗漏的对比项,请补充!

  可以看到SmallestWidth 限定符适配方案和今日头条适配方案的适配效果其实都是差不多的,我在前面的文章中也通过公式计算过它们的精确度,SmallestWidth 限定符适配方案运行在未覆盖的机型上虽然也可以适配,但是却会出现一定的误差,所以今日头条适配方案的适配精确度确实要比SmallestWidth 限定符适配方案略高的,不过只要SmallestWidth 限定符适配方案合理的分配资源文件,适配效果的差距应该也不大

  SmallestWidth 限定符适配方案主打的是稳定性,在运行过程中极少会出现安全隐患,适配范围也可控,不会产生其他未知的影响,而今日头条适配方案主打的是降低开发成本、提高开发效率,使用上更灵活,也能满足更多的扩展需求,简单一句话概括就是,这两兄弟,一个求稳,一个求快,好了,我就介绍这么多了,自己选择吧!跑狗网论坛

  下面就开始介绍我根据今日头条屏幕适配方案优化的屏幕适配框架AndroidAutoSize,大家千万不要认为,我推出的屏幕适配框架AndroidAutoSize是根据今日头条屏幕适配方案优化的,我本人就一定支持今日头条屏幕适配方案是最好的Android屏幕适配方案这个观点,它确实很优秀,但同样也有很多不足,我最真实的观点在上面就已经表述咯,至于我为什么要根据今日头条屏幕适配方案再封装一个屏幕适配框架,无外乎就以下几点原因:

  SmallestWidth 限定符适配方案已经有多个优秀的开源解决方案了,它们已经能满足我们日常开发中的所有需求

  今日头条官方技术团队只公布了今日头条屏幕适配方案的文章以及核心代码,但并没有在Github上创建公开的仓库,一个新的方案必定要有一个成长迭代的过程,在此期间,一定需要一个可以把所有使用者聚集起来的公共社区,可以让所有使用该方案的使用者在上面交流,大家一起总结、一起填坑,这样才能让该方案更成熟稳定,这就是开源的力量

  今日头条官方技术团队公布的核心代码并不能满足我的所有需求,已经开源的其他基于今日头条屏幕适配方案的开源项目以及解决方案也不能满足我的所有需求,而我有更好的实现想法

  MVPArms需要一个适配效果还不错并且切换维护成本也比较低的屏幕适配框架,以帮助使用者用较低的成本、工作量将已经停止维护的AndroidAutoLayout快速替换掉

  我建议大家都可以去实际体验一下今日头条屏幕适配方案和SmallestWidth 限定符适配方案,感受下它们的异同,我给的建议是,可以在项目中先使用今日头条屏幕适配方案,三肖期期准香港白小姐感受下它的使用方式以及适配效果,今日头条屏幕适配方案的侵入性非常低,如果在使用过程中遇到什么不能解决的问题,马上可以切换为其他的屏幕适配方案,在切换的过程中也花费不了多少工作量,试错成本非常低

  但如果你在项目中先使用SmallestWidth 限定符适配方案,之后在使用的过程中再遇到什么不能解决的问题,这时想切换为其他的屏幕适配方案,这工作量可就大了,每个Layout文件都含有大量的dimens引用,改起来这工作量得有多大,想想都觉得后怕,这就是侵入性太高导致的最致命的问题

  如果想体验今日头条屏幕适配方案,千万不要错过AndroidAutoSize哦!仅需一步即可接入项目,下面是AndroidAutoSize的地址:

  AndroidAutoSize与今日头条屏幕适配方案的关系,相当于汽车和发动机的关系,今日头条屏幕适配方案官方公布的代码,只实现了修改系统density的相关逻辑,这的确在屏幕适配中起到了最关键的作用,但这还远远还不够

  要想让使用者能够更傻瓜式的使用该方案,并且能够应对日常开发中的所有复杂需求,那在架构框架时,还需要考虑API的易用性以及合理性、框架的扩展性以及灵活性、功能的全面性、注释和文档的易读性等多个方面的问题

  于是我带着我的这些标准在网上搜寻了很久,发现并没有任何一个开源框架或解决方案能够达到我的所有标准,它们大多数还只是停留在将今日头条屏幕适配方案封装成工具类来引入项目的阶段,这样在功能的扩展上有限制,并且对用户的使用体验也不好,而我想做的是一个全面性的产品级屏幕适配框架,这离我最初的构想,差距还非常大,于是我只好自己动手,将我的所有思想实现,这才有了AndroidAutoSize

  写完AndroidAutoSize框架后,因为对今日头条屏幕适配方案有了更加深入的理解,所以才写了骚年你的屏幕适配方式该升级了!(一)-今日头条适配方案,以帮助大家更清晰的理解今日头条屏幕适配方案

  AndroidAutoSize因为名字和鸿神的AndroidAutoLayout非常相似,并且在填写设计图尺寸的方式上也极为相似,再加上我写的屏幕适配系列的文章也发布在了鸿神的公众号上,所以很多人以为AndroidAutoSize是鸿神写的AndroidAutoLayout的升级版,这里我哭笑不得 😂,我只好在这里说一句,大家好,我叫JessYan,的确可以理解为AndroidAutoSize是AndroidAutoLayout的升级版,但是它是我写的,关注一波呗

  之所以将框架取名为AndroidAutoSize,第一,是想致敬AndroidAutoLayout对Android屏幕适配领域的贡献,第二,也想成为在Android屏幕适配领域有重要影响力的框架

  我在上面就已经说了很多开源框架以及解决方案,只是把今日头条屏幕适配方案简单的封装成一个工具类然后引入项目,这时很多人就会说了今日头条屏幕适配方案官方公布的全部代码都只有30行不到,你不把它封装成工具类,那封装成什么?该怎么封装?下面就来看看AndroidAutoSize的整体结构

  AndroidAutoSize根据今日头条屏幕适配方案官方公布的30行不到的代码,经过不断的优化和扩展,发展成了现在拥有18个类文件,上千行代码的全面性屏幕适配框架,在迭代的过程中完善和优化了很多功能,相比今日头条屏幕适配方案官方公布的原始代码,AndroidAutoSize更加稳定、更加易用、更加强大,欢迎阅读源码,注释非常详细哦!

  AndroidAutoSize在使用上非常简单,只需要填写设计图尺寸这一步即可接入项目,但需要注意的是,AndroidAutoSize有两种类型的布局单位可以选择,一个是主单位 (dp、sp),一个是副单位 (pt、in、mm),两种单位面向的应用场景都有不同,也都有各自的优缺点

  主单位: 使用dp、sp为单位进行布局,侵入性最低,会影响其他三方库页面、三方库控件以及系统控件的布局效果,但AndroidAutoSize也通过这个特性,使用ExternalAdaptManager实现了在不修改三方库源码的情况下适配三方库的功能

  副单位: 使用pt、in、mm为单位进行布局,侵入性高,对老项目的支持比较好,不会影响其他三方库页面、三方库控件以及系统控件的布局效果,可以彻底的屏蔽修改density所造成的所有未知和已知问题,但这样AndroidAutoSize也就无法对三方库进行适配

  大家可以根据自己的应用场景在主单位和副单位中选择一个作为布局单位,建议想引入老项目并且注重稳定性的人群使用副单位,只是想试试本框架,随时可能切换为其他屏幕适配方案的人群使用主单位

  其实AndroidAutoSize可以同时支持主单位和副单位,但AndroidAutoSize可以同时支持主单位和副单位的目的,只是为了让使用者可以在主单位和副单位之间灵活切换,因为切换单位的工作量可能非常巨大,不能立即完成,但领导又要求马上打包上线,这时就可以起到一个很好的过渡作用

  在使用主单位时,design_width_in_dp和design_height_in_dp的单位必须是dp,如果设计师给你的设计图,只标注了px尺寸 (现在已经有很多UI工具可以自动标注dp尺寸了),那请自行根据公式dp = px / (DPI / 160)将px尺寸转换为dp尺寸,如果你不知道DPI是多少?那请以自己测试机的DPI为准,如果连怎么得到设备的DPI都不知道?百度吧好伐,如果你实在找不到设备的DPI那就直接将px尺寸除以3或者2也是可以的

  如果你只是想使用 AndroidAutoSize 的基础功能,AndroidAutoSize 的使用方法在这里就结束了,只需要上面这一步,即可帮助你以最简单的方式接入 AndroidAutoSize,但是作为一个全面性的屏幕适配框架,在保证基础功能的简易性的同时,也必须保证复杂的需求也能在框架内被解决,从而达到一个小闭环,所以下面介绍的内容全是前人踩坑踩出来的一些必备功能,如果你没这个需求,或者觉得麻烦,可以按需查看或者跳过,下面的内容建议和 Demo 配合起来阅读,效果更佳

  只会将高度和宽度其中的一个作为基准进行适配,一方作为基准,另一方就会变为备用,默认以宽度为基准进行适配,可以通过

  不停的切换,这意味着最后运行到设备上的布局效果,在高度和宽度中只有一方可以和设计图上一模一样,另外一方会和设计图出现偏差,为什么不像

  一样,高和宽都以设计图的效果等比例完美呈现呢?这也很简单,你无法保证所有设备的高宽比例都和你设计图上的高宽比例一致,特别是在现在全面屏全面推出的情况下,如果这里不这样做的话,当你的项目运行在与设计图高宽比例不一致的设备上时,布局会出现严重的变形,这个几率非常大,详情请看这里

  很多人有疑惑,为什么使用者只需要在AndroidManifest.xml中填写一下meta-data标签,其他什么都不做,AndroidAutoSize就能自动运行,并在App启动时自动解析AndroidManifest.xml中填写的设计图尺寸,这里很多人不敢相信,问我真的只需要填写下设计图尺寸框架就可以正常运行吗?难道使用了什么黑科技?

  其实这里并没有用到什么黑科技,原理反而非常简单,只需要声明一个ContentProvider,在它的onCreate方法中启动框架即可,在App启动时,系统会在App的主进程中自动实例化你声明的这个ContentProvider,并调用它的onCreate方法,执行时机比Application#onCreate还靠前,可以做一些初始化的工作,get到了吗?

  这里需要注意的是,如果你的项目拥有多进程,系统只会在主进程中实例化一个你声明的ContentProvider,并不会在其他非主进程中实例化ContentProvider,如果在当前进程中ContentProvider没有被实例化,那ContentProvider#onCreate就不会被调用,你的初始化代码在当前进程中也就不会执行,这时就需要在Application#onCreate中调用下ContentProvider#query执行一下查询操作,这时ContentProvider就会在当前进程中实例化 (每个进程中只会保证有一个实例),所以应用到框架中就是,如果你需要在多个进程中都进行屏幕适配,那就需要在Application#onCreate中调用AutoSize#initCompatMultiProcess方法

  虽然AndroidAutoSize不需要其他过多的配置,只需要在AndroidManifest.xml中填写下设计图尺寸就能正常运行,但AndroidAutoSize还是为大家准备了很多可配置选项,尽最大可能满足大家日常开发中的所有扩展需求

  在AndroidManifest.xml中填写的设计图尺寸,是整个项目的全局设计图尺寸,但是如果某些Activity页面由于某些原因,设计师单独出图,这个页面的设计图尺寸和在AndroidManifest.xml中填写的设计图尺寸不一样该怎么办呢?不要急,AndroidAutoSize已经为你考虑好了,让这个页面的Activity实现CustomAdapt接口即可实现你的需求,CustomAdapt接口的第一个方法可以修改当前页面的设计图尺寸,第二个方法可以切换当前页面的适配基准,下面的注释都解释的很清楚

  Fragment的自定义方式和Activity是一样的,只不过在使用前需要先在App初始化时开启对Fragment的支持

  由于AndroidAutoSize要求需要自定义适配参数或取消适配的页面必须实现CustomAdapt、CancelAdapt,这时问题就来了,三方库是通过远程依赖的,我们无法修改它的源码,这时我们怎么让三方库的页面也能实现自定义适配参数或取消适配呢?别急,这个需求AndroidAutoSize也已经为你考虑好了,当然不会让你将三方库下载到本地然后改源码!

  前面已经介绍了副单位的应用场景,这里就直接介绍副单位如何使用,副单位的Demo在demo-subunits

  首先和主单位一样也需要先在app的AndroidManifest.xml中填写上设计图尺寸,但和主单位不一样的是,当在使用副单位时design_width_in_dp和design_height_in_dp的单位不需要一定是dp,可以直接填写设计图的px尺寸,在布局文件中每个控件的大小也可以直接填写设计图上标注的px尺寸,无需再将px转换为dp,这是副单位的特性之一,可以帮助大家提高开发效率

  由于AndroidAutoSize提供了pt、in、mm三种类型的副单位供使用者选择,所以在使用副单位时,还需要在APP初始化时,通过UnitsManager#setSupportSubunits(Subunits)方法选择一个你喜欢的副单位,然后在布局文件中使用这个副单位进行布局,三种类型的副单位,其实效果都是一样,大家按喜欢的名字选择即可

  由于使用副单位是为了彻底屏蔽修改density所造成的对三方库页面、三方库控件以及系统控件的布局效果的影响,所以在使用副单位时建议调用UnitsManager#setSupportDP(false)和UnitsManager#setSupportSP(false),关闭AndroidAutoSize对dp和sp的支持,AndroidAutoSize为什么不在使用副单位时默认关闭对dp、sp的支持?因为允许同时支持主单位和副单位可以帮助使用者在主单位和副单位之间切换时更好的过渡,这点在前面就已经提到过

  在使用副单位时自定义Activity和Fragment的方式是和主单位是一样的,这里就不再过多介绍了

  如果你的项目在使用副单位并且关闭了对主单位 (dp、sp)的支持,这时ExternalAdaptManager对三方库的页面是不起作用的,只对自己项目中的页面起作用,除非三方库的页面也使用了副单位(pt、in、mm)进行布局

  其实副单位之所以能彻底屏蔽修改density所造成的对三方库页面、三方库控件以及系统控件的布局效果的影响,就是因为三方库页面、三方库控件以及系统控件基本上使用的都是dp、sp进行布局,所以只要AndroidAutoSize关闭了对dp、sp的支持,转而使用副单位进行布局,就能彻底屏蔽修改density所造成的对三方库页面、三方库控件以及系统控件的布局效果的影响

  但这也同样意味着使用副单位就不能适配三方库的页面了,ExternalAdaptManager也就对三方库的页面不起作用了

  在开发阶段布局时的实时预览是一个很重要的环节,很多情况下Android Studio提供的默认预览设备并不能完全展示我们的设计图,所以我们就需要自己创建模拟设备,dp、pt、in、mm这四种单位的模拟设备创建方法请看这里

  AndroidAutoSize在经历了240+ commit、60+ issues、6 个版本的洗礼后,逐渐的稳定了下来,已经在上个星期发布了首个正式版,在这里要感谢将AndroidAutoSize接入到自己项目中的上千个使用者,感谢他们的信赖,AndroidAutoSize创建的初衷就是为了让所有使用今日头条屏幕适配方案的使用者能有一个可以一起交流、沟通的聚集地,所以后面也会持续的收集并解决今日头条屏幕适配方案的常见问题,让今日头条屏幕适配方案变得更加成熟、稳定

  至此本系列的第三篇文章也就完结了,这也预示着这个系列连载的终结,这篇文章建议结合系列的第一篇文章骚年你的屏幕适配方式该升级了!(一)-今日头条适配方案一起看,这样可以对今日头条屏幕适配方案有一个更深入的理解,如果你能将整个系列的文章都全部认真看完,那你对Android屏幕适配领域的相关知识绝对会有一个飞速的提升!

  当你的项目需要切换某个框架时,香港猛虎报彩图图库。你会怎么去考察、分析、对比现有的开源方案,并有足够的理由去选择或优化一个最适合自己项目的方案呢?其实整个系列文章可以看作是我怎么去选择同类型开源方案的过程,你以后当遇到同样的选择也可以参照我的思维方式去处理,当然如果以后面试官问到你屏幕适配相关的问题,你能将我如何选择、分析、对比已有方案的过程以及文章中的核心知识点告诉给面试官,那肯定比你直接说一句我使用的是某某开源库有价值得多