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的基本使用,但是这个框架怎么实现的屏幕适配我们还得自己去看源码。

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ContOS8 yum 安装rabbitMQ「建议收藏」

    ContOS8 yum 安装rabbitMQ「建议收藏」ContOS8 yum 安装rabbitMQ

    2022年4月23日
    38
  • python pandas fillna_python rfind函数

    python pandas fillna_python rfind函数本文概述我们可以使用fillna()函数填充数据集中的空值。句法DataFrame.fillna(value=None,method=None,axis=None,inplace=False,limit=None,downcast=None,**kwargs)参数值:它是一个用于填充空值的值,或者是一个Series/dict/DataFrame。method:一种用于填充重新…

    2022年8月12日
    6
  • 黑苹果怎么安装clover(clover引导教程)

    黑苹果安装教程多逛逛论坛,多攒攒人品,相信人品加技术再有点经验,安装黑苹果并不难(大神说的。。。。)

    2022年4月17日
    58
  • matlab中表示拉普拉斯分布_拉普拉斯分布的随机数[通俗易懂]

    matlab中表示拉普拉斯分布_拉普拉斯分布的随机数[通俗易懂]一、功能产生拉普拉斯分布的随机数。二、方法简介1、产生随机变量的组合法将分布函数\(F(x)\)分解为若干个较为简单的子分布函数的线性组合\[F(x)=\sum_{i=1}^{K}p_{i}F_{i}(x)\]其中$p_{i}>0\(\foralli)$,且$\sum_{i=1}^{K}p_{i}=1$,\(F(x)\)是分布函数。定理若随机变量\(\xi\sim…

    2025年7月5日
    5
  • 模仿学习对比强化学习「建议收藏」

    模仿学习对比强化学习「建议收藏」模仿学习介绍模仿学习是将专家经验作为样本进行强监督学习的一种方法。模仿学习对比强化学系模仿学习优点:1.简单、稳定的监督学习过程缺点:1.需要提供榜样行为数据2.需要处理多解型行为(例如绕过障碍物,可以从左边或者右边,但是专家数据不一定覆盖所有行为,可以用多元高斯分布去等方法去处理)3.不能超越人类水平强化学习优点:1.可以超越人类水平缺点:1.需要设置奖励函数2.必须解决策略探索性问题3.训练可能不收敛、不稳定结合模仿学习和强化学习:Pretrain&Finetune

    2026年1月21日
    4
  • vim乱码恢复_linux保存退出命令

    vim乱码恢复_linux保存退出命令初始时,安装好Ubuntu以后,使用Vim退出以后会显示乱码,这是由于Ubuntu的Vim默认是链接到了/usr/bin/gnome,这是不同于一般使用习惯的Vim,所以我们如果需要使用一般习惯的Vim,并且解决Vim退出以后的乱码问题,我们必须使Vim链接到我们常用的Vim.basic,步骤如下:1.使用apt-get安装Vim包,系统默认安装的是Vim-gnome包,命令如下:sud

    2022年8月24日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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