AndroidAutoSize今日头条适配方案[通俗易懂]

AndroidAutoSize今日头条适配方案[通俗易懂]最近公司没有什么事,闲来无聊,就研究一下今日头条的适配方案,不看不知道,真是一看吓一跳,快速上手而且还简单易懂,推荐一篇文章:http://www.wanandroid.com/blog/show/2343我也是看的这位大佬写的。今日头条适配只是一个基准,它是以宽或者高来进行适配的。今日头条的适配是通过修改Application/Activity等的DisplayMetrics…

大家好,又见面了,我是你们的朋友全栈君。

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

推荐一篇文章:

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

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

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

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

AndroidAutoSize今日头条适配方案[通俗易懂]

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

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

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

implementation 'me.jessyan:autosize:1.1.2'

2.然后在manifest配置:

<!-- 如果您项目中的所有页面都只需要以高或宽中的一个作为基准进行适配的话, 那就只需要填写高或宽中的一个设计图尺寸即可 -->
<meta-data
    android:name="design_width_in_dp"
    android:value="360" />
<meta-data
    android:name="design_height_in_dp"
    android:value="640" />

这里我们适配的是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,就可以了

AndroidAutoSize今日头条适配方案[通俗易懂]

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

AndroidAutoSize今日头条适配方案[通俗易懂]

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

二、Fragment支持

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

AutoSizeConfig.getInstance().setCustomFragment(true);

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

AndroidAutoSize今日头条适配方案[通俗易懂]

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

AndroidAutoSize今日头条适配方案[通俗易懂]

万能解决方案:

在任何情况下本来适配正常的布局突然出现适配失效,适配异常等问题,只要重写 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的基本使用,但是这个框架怎么实现的屏幕适配我们还得自己去看源码。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134776.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java截取String字符串的几种方法

    Java截取String字符串的几种方法方法一,指定字符,截取字符串,返回字符串数组:Stringstr=”abcd,123,123abc,fij23″;String[]strs=str.split(“,”);方法二,指定索引号,截取字符串:将字符串从索引号为5开始截取,一直到字符串末尾。(索引值从0开始):Stringstr=”abcdefghijklmnopqrstuvwxyz”;str.substri…

  • 【2022最新Java面试宝典】—— Java基础知识面试题(91道含答案)

    【2022最新Java面试宝典】—— Java基础知识面试题(91道含答案)目录一、Java概述1.何为编程2.什么是Java3.jdk1.5之后的三大版本4.Jdk和Jre和JVM的区别5.什么是跨平台性?原理是什么6.Java语言有哪些特点7.什么是字节码?采用字节码的最大好处是什么8.什么是Java程序的主类?应用程序和小程序的主类有何不同?9.Java应用程序与小程序之间有那些差别?10.Java和C++的区别11.OracleJDK和OpenJDK的对比二、基础语法数据类型12.Java有哪些数据类型13.switch是否能作用在by

  • C语言中从键盘输入字符串时的一些问题[通俗易懂]

    C语言中从键盘输入字符串时的一些问题[通俗易懂]C语言中从键盘输入字符串时的一些问题1.scanf()scanf()在输入字符串时有很大的弊端,例如:1).scanf()在从键盘读入字符时并不会根据所定义的字符数组的大小来控制读入多少个,而是从scanf()中传入的地址开始一直访问下一个元素的内存,碰见空格符或者回车符时才停止读入并存入结束符’\0’,这就有可能造成了一个在C中非常严重的问题,访问非法内存.如果…

  • struts2 拦截器_struts2自定义拦截器

    struts2 拦截器_struts2自定义拦截器拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理。同时,拦截器也可以让你将通用的代码模块化并作为可重用的类。Struts2中的很多特性都是由拦截器来完成的。拦截是AOP的一种实现策略。拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action…

  • Android测试三件套:传文件、抓包、看日志

    Android测试三件套:传文件、抓包、看日志

    2020年11月20日
  • RMAN传输表空间迁移数据

    RMAN传输表空间迁移数据

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号