Android的屏幕种类多种多样,适配器来很麻烦,市面上的适配方法也是多种多样,总结起来是下面4种
- 使用鸿洋大神的软件生成大量px文件放到项目中
- 使用鸿洋大神的AutoLayout框架(不再维护)
- 头条方案
- 谷歌百分比布局(已废弃)
- 谷歌约束布局(替换百分比布局)
- 使用pt物理单位
下面逐一说一下利弊
-
使用鸿洋大神的软件生成大量px文件放到项目中
这种方式,是根据dp、density、px换算出来一堆px文件,分辨对应不同分辨率的手机,能解决大部分的适配问题,但是如果遇到分辨率比较高但是屏幕尺寸比较大的时候,这个设备的dpi会比较低,然后就会有些问题,而且这样也会有一大堆"values-宽X高"文件夹,里面有一大堆的px文件,增加apk体积。这时候应该可以再创建类似values-160dpi这种文件夹来解决,而且可以创建values-160dpi-1024x600这种文件夹,这些文件夹可以混用,优先用更精确的那个。 -
使用鸿洋大神的AutoLayout框架
这个方式也不错,里面的源码我还没仔细看,我们公司也用的这种方式,不过有些控件会有问题,针对这些控件鸿洋有一些重写,不过没有的就需要自己去写了 -
头条方案
方案介绍:
https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA
该方案的补充与扩展:
https://juejin.im/post/5b7fafb351882542af1c75ad -
谷歌百分比布局
github地址:
https://github.com/JulienGenoud/android-percent-support-lib-sample
鸿洋自己扩展的该库地址:
https://github.com/hongyangAndroid/android-percent-support-extend
鸿洋介绍了这个百分比布局:
https://blog.csdn.net/lmj623565791/article/details/46695347
这个百分比布局,很久不更新了,应该是废弃了 -
约束布局(ConstraintLayout),这个我还没怎么去了解,待这几天看看研究一下再来完善该篇文章,在这篇文档里:https://developer.android.com/reference/android/support/percent/package-summary ,谷歌明确表示废弃了百分比布局库,而应该使用约束布局。
-
使用pt物理单位
源链接:http://www.apkbus.com/blog-177177-76719.html
涉及到的代码:https://github.com/Firedamp/Rudeness/blob/daad96fc6bcef8579fefdfc8e8ddc1046c89d26a/rudeness-sdk/src/main/java/com/bulong/rudeness/RudenessScreenHelper.java
在上面这个链接里有段代码是resources.getDisplayMetrics().xdpi = size.x/designWidth*72f;
在android系统里有个方法是这样的
public static float applyDimension(int unit, float value, DisplayMetrics metrics){ switch (unit) { case COMPLEX_UNIT_PX: return value; case COMPLEX_UNIT_DIP: return value * metrics.density; case COMPLEX_UNIT_SP: return value * metrics.scaledDensity; case COMPLEX_UNIT_PT: return value * metrics.xdpi * (1.0f/72); case COMPLEX_UNIT_IN: return value * metrics.xdpi; case COMPLEX_UNIT_MM: return value * metrics.xdpi * (1.0f/25.4f); } return 0; }
value * metrics.xdpi * (1.0f/72) = 该控件实际显示的px值
可以换算为metrics.xdpi = 该控件实际显示的px值/value*72
,其中value
是该控件在设计图显示的pt值大小
而我们要保证这个控件在任何分辨率下都相对于屏幕大小有固定的比例,只需要让控件实际显示的px值/value=实际屏幕显示的px值/实际屏幕的pt值大小
,也就是resources.getDisplayMetrics().xdpi = size.x/designWidth*72f
参考文章较多,记录几个
https://www.jianshu.com/p/c772cf49469a
http://www.apkbus.com/blog-177177-76719.html
网友评论