去年在帮公司面试安卓开发的时候经常听到应聘者提到今日头条App的安卓适配方式,有些应试者大致上讲了一下它的工作原理,即直接强制修改系统提供的像素密度比(density)来完成适配。
个人觉得这种适配方式相比较 普通的 dp 和 dimen 适配还是有很大优势的,之所以很多安卓手机的展示存在问题,无非就是其手机的分辨率和density之间的对应关系不符合下图的标准:
举个反面教材,前两年很多人用过的乐视手机就是这样,明明是 1920 * 1080的分辨率,可是系统获取到的 density 却小于3(大约是2.6这个样子),这个时候这部手机展示任何View和文字肯定都是偏小的,而且dp的值越大,其在通过 density 换算出最终像素值的误差就越明显。所以今日头条通过直接修改系统提供的 density 值来完成屏幕适配的方式,是真正的对症下药。
相比其它适配框架,它对原有代码的侵入性也很小,只要提供一个修改 density 的地方,其它地方该怎么写还是怎么写,也无需像dimen一样写一堆对应分辨率的文件。但不足之处是,今日头条的适配框架仅仅针对设计图宽度为 360dp 的App进行了适配,如果要使用这套框架,必须还得手动修改代码,计算出准确的 density 值,关键的计算公式如下:
这样框架的快速的复用性就打折了。因此,我们可以借鉴图一,通过官方提供的手机分辨率和 density 之间的对应关系来实时获取当前设备的分辨率,算出一个基本合理的 density 值,和设备系统提供的值相比较,如果不相等,直接修改。这样就可以达到我们将这套屏幕适配代码随意复用的目的了。以上这段话翻译成代码该这么写:
重点来啦~ 介绍使用方式,同时提供代码分享地址(获取代码点这里,百度云提取码:7xrs),首先把我提供的代码复制到项目当中,其次找到 SunUiUtil 下的 fixLayout 方法,把方法的参数改成自己项目里面的 BaseActivity ,以上工作完成之后,我们就在项目里面的每一个 BaseActivity 中调用 onCreate 方法的时候,调用 SunUiUtil 下的 fixLayout 方法即可完成屏幕适配。
我一般调用 fixLayout 的位置都在 setContentView 之前:
这样你的App就可以完美适配任意的手机屏幕了,为了对比明显,我们直接用逍遥模拟器(PC模拟器的 density 一般都和官方要求的误差很大)来展示适配前后的对比图:
适配前(字体大小和自定义下拉刷新UI已经惨不忍睹)
适配后(所有问题完美解决)
在本文最后说两个注意事项:
1)使用本屏幕适配方式,最好不要在基类复写 BaseActivity 的 getResource,更不能去修改其中的 DisplayMetrics ,否则将导致我们设置好了的 density 值被重新更新覆盖,达不到适配目的,错误代码如下图所示,大家千万不要这么写:
2)启用这套UI适配框架之后,我发现项目原有的圆形头像切割出问题了,因此我提供的工具包中多了一个类:CircularImage,大家用它绘制圆形头像就木有问题了
以上,完结撒花,转载请注明出处~
网友评论