阅读:
Android 目前稳定高效的UI适配方案
https://mp./s/X-aL2vb4uEhqnLzU5wjc4Q
前言:
不管你在布局文件中填写的是什么单位,最后都会被转化为px,系统就是通过上面的方法,将你在项目中任何地方填写的单位都转换为px的。px转dp的公式dp = px / density,就是根据上面的方法得来的,density在公式的运算中扮演着至关重要的一步。
要看懂下面的内容,还得明白,今日头条的适配方式,今日头条适配方案默认项目中只能以高或宽中的一个作为基准,进行适配,为什么不像AndroidAutoLayout一样,高以高为基准,宽以宽为基准,同时进行适配呢?
这就引出了一个现在比较棘手的问题,大部分市面上的Android设备的屏幕高宽比都不一致,特别是现在大量全面屏的问世,这个问题更加严重,不同厂商推出的全面屏手机的屏幕高宽比都可能不一致。
这时我们只以高或宽其中的一个作为基准进行适配,就会有效的避免布局在高宽比不一致的屏幕上出现变形的问题。
明白这个后,我再来说说density,density在每个设备上都是固定的,DPI / 160 = density,屏幕的总 px 宽度 / density = 屏幕的总 dp 宽度
设备 1,屏幕宽度为1080px,480DPI,屏幕总dp宽度为1080 / (480 / 160) = 360dp
设备 2,屏幕宽度为1440,560DPI,屏幕总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在任何分辨率的屏幕上,与屏幕的比例都是相同的
这时我们该怎么做呢?改变每个View的dp值?不现实,在每个设备上都要通过代码动态计算View的dp值,工作量太大
如果每个View的dp值是固定不变的,那我们只要保证每个设备的屏幕总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 屏幕适配方案
/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./s/X-aL2vb4uEhqnLzU5wjc4Q
以上两种方案我个人感觉 AndroidAutoSize 框架所以用的今日头条适配技术 侵入性比 SmallestWidth要低些,以后如果要更改适配方式比较方便, 使用 SmallestWidth 方案的话以后更该维护起来比较费劲(这纯属与个人看法,如有得罪的地方请海涵,毕竟偶还是个小白)
今日头条屏幕适配方案终极版:
/JessYanCoding/AndroidAutoSize