AndroidAutoSize今日头条适配方案

最近公司没有什么事,闲来无聊,就研究一下今日头条的适配方案,不看不知道,真是一看吓一跳,快速上手而且还简单易懂,

推荐一篇文章:

http://www.wanandroid.com/blog/show/2343

我也是看的这位大佬写的。

今日头条适配只是一个基准,它是以宽或者高来进行适配的。

今日头条的适配是通过修改Application/Activity等的DisplayMetrics类中核心数据density字段(屏幕密度, density = dpi/160, dp与px之间的转化就是用此参数),使得在不同分辨率手机上对应的dp相等而达到每个显示的View占用屏幕的比例相同。

AndroidAutoSize今日头条适配方案_第1张图片

当然这个类里面还有其他几个重要的参数,density、densityDpi、scaledDensity,AndroidAutoSize的原理主要就是修改这几个参数值来实现屏幕的适配。

接下来我们就用AndroidAutoSize实践一下。

1.首先我们需要导入依赖,

implementation 'me.jessyan:autosize:1.1.2'

2.然后在manifest配置:



这里我们适配的是dp,这里的360是宽度,640是高度,当然这里我们设置的是全局的,宽度高度我们都是需要根据设计图来定的,我们这里先用360来测试一下。

3.我们创建一个类继承Application,在onCreate里面初始化一下AutoSize:

当 App 中出现多进程, 并且您需要适配所有的进程, 就需要在 App 初始化时调用 initCompatMultiProcess() 在 Demo 中跳转的三方库中的 DefaultErrorActivity 就是在另外一个进程中, 所以要想适配这个 Activity 就需要调用 initCompatMultiProcess()

AutoSize.initCompatMultiProcess(this);
以下是 AndroidAutoSize 可以自定义的参数:
 AutoSizeConfig.getInstance()

                //是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
                //如果没有这个需求建议不开启
                .setCustomFragment(true)

                //是否屏蔽系统字体大小对 AndroidAutoSize 的影响, 如果为 true, App 内的字体的大小将不会跟随系统设置中字体大小的改变
                //如果为 false, 则会跟随系统设置中字体大小的改变, 默认为 false
                .setExcludeFontScale(true)

                //屏幕适配监听器
                .setOnAdaptListener(new onAdaptListener() {
                    @Override
                    public void onAdaptBefore(Object target, Activity activity) {
                        //使用以下代码, 可支持 Android 的分屏或缩放模式, 但前提是在分屏或缩放模式下当用户改变您 App 的窗口大小时
                        //系统会重绘当前的页面, 经测试在某些机型, 某些情况下系统不会重绘当前页面, ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application!!!
//                        AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
//                        AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
                        LogUtils.d(String.format(Locale.ENGLISH, "%s onAdaptBefore!", target.getClass().getName()));
                    }

                    @Override
                    public void onAdaptAfter(Object target, Activity activity) {
                        LogUtils.d(String.format(Locale.ENGLISH, "%s onAdaptAfter!", target.getClass().getName()));
                    }
                })

        //是否打印 AutoSize 的内部日志, 默认为 true, 如果您不想 AutoSize 打印日志, 则请设置为 false
//                .setLog(false)

        //是否使用设备的实际尺寸做适配, 默认为 false, 如果设置为 false, 在以屏幕高度为基准进行适配时
        //AutoSize 会将屏幕总高度减去状态栏高度来做适配
        //设置为 true 则使用设备的实际屏幕高度, 不会减去状态栏高度
//                .setUseDeviceSize(true)

        //是否全局按照宽度进行等比例适配, 默认为 true, 如果设置为 false, AutoSize 会全局按照高度进行适配
//                .setBaseOnWidth(false)

        //设置屏幕适配逻辑策略类, 一般不用设置, 使用框架默认的就好
//                .setAutoAdaptStrategy(new AutoAdaptStrategy())
        ;

初始化完毕后,我们就可以正常使用了,页面布局时不需要额外的代码和操作了。

一、Activity支持:

1.当我们某个activity不想适配了,我们只需要实现CancelAdapt,就可以了

2.当我们想自定义宽高,不想使用全局定义好的,我们只需要实现CustomAdapt,就可以了:

AndroidAutoSize今日头条适配方案_第2张图片

当然我们这里对应的宽高单位也是dp的。

二、Fragment支持

2.1、首先开启支持 Fragment 自定义参数的功能

AutoSizeConfig.getInstance().setCustomFragment(true);

2.2、当某个 Fragment 的设计图尺寸与在 AndroidManifest 中填写的全局设计图尺寸不同时,可以实现 CustomAdapt 接口扩展适配参数

AndroidAutoSize今日头条适配方案_第3张图片

2.3、当某个 Fragment 想放弃适配,请实现 CancelAdapt 接口

万能解决方案:

在任何情况下本来适配正常的布局突然出现适配失效,适配异常等问题,只要重写 Activity 的 getResources() 方法即可,如果是 Dialog、PopupWindow 等控件出现适配失效或适配异常,同样在每次 show() 之前调用 AutoSize#autoConvertDensity() 即可。

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

这个api里面的参数点击进去源码,里面会有相应的介绍。

到目前为止我们已经掌握了AndroidAutoSize的基本使用,但是这个框架怎么实现的屏幕适配我们还得自己去看源码。

 

你可能感兴趣的:(AndroidAutoSize今日头条适配方案)