文章目录

  • 前言
  • 详细使用
  • 原理
  • 补充



前言

不同的手机尺寸不一样,适配也不一样,找到一款屏幕适配框架-AndroidAutoSize,先简单的使用一下,后续在进行补充

详细使用

1.进行依赖

implementation 'me.jessyan:autosize:1.2.0'

2.在AndroidManifest.xml添加

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

以上使用的360与640都是已dp为单位的,如果设计图是以dp单位标注的,直接用就行了,但是大部分是已px标注的,给一个公式,大家自己换算一下就可以了。
公式:dp = px / (dpi / 160)
不会换算的就获取自己测试app用的手机的dp
附上一个链接,可以直接用链接上面获取设备的dp就可以了。

3.在布局中的控件使用dp作为单位就可以了

附上gitHub中文地址:
https://github.com/JessYanCoding/AndroidAutoSize/blob/master/README-zh.md

原理

对于详细的原理说明建议大家去这篇文章看看,讲的挺详细的
点这里

补充

1.在这里我推荐一个查看设计图软件尺寸的软件PxCook,下载下来就可以用,可以添加Android项目,将设计图导入进去之后,就可以查看设计图的各种尺寸,也不用再进行各种尺寸转换了。

2.我之前在项目中使用此框架的时候,遇到过屏幕适配失灵的情况,后来查询资料发现,只要在失效的Activity重写getResources()就可以,代码如下:

@Override
    public Resources getResources() {
        //需要升级到 v1.1.2 及以上版本才能使用 AutoSizeCompat
        AutoSizeCompat.autoConvertDensityOfGlobal((super.getResources()));//如果没有自定义需求用这个方法
        //AutoSizeCompat.autoConvertDensity((super.getResources(), 667, false);//如果有自定义需求就用这个方法
        return super.getResources();
    }

有时候我重写了getResources()方法之后,布局适配还会失效,这个时候我们可以这样写

@Override
    public Resources getResources() {
        //需要升级到 v1.1.2 及以上版本才能使用 AutoSizeCompat
        //AutoSizeCompat.autoConvertDensityOfGlobal((super.getResources()));//如果没有自定义需求用这个方法
        //下面667写自己设计图中的以dp为单位的大小
        AutoSizeCompat.autoConvertDensity((super.getResources(), 667, false);//如果有自定义需求就用这个方法
        return super.getResources();
    }

如果这样还不行,重写 父布局 的 generateLayoutParams(AttributeSet),并在方法中设置正确的 DisplayMetrics#density

@Override
    public LayoutParams generateLayoutParams(AttributeSet attrs) {
        AutoSizeCompat.autoConvertDensityOfGlobal((getResources());//如果没有自定义需求用这个方法
        AutoSizeCompat.autoConvertDensity((getResources(), 667, false);//如果有自定义需求就用这个方法
        return super.generateLayoutParams(attrs);
    }

如果在失效就去gitHub上看看有没有其它解决方案