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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 屡次停止运行怎么解决_很抱歉已停止运行解决方法

    屡次停止运行怎么解决_很抱歉已停止运行解决方法背景我一般运行appium都是在osx或者linux上面,最近在教几个同事使用appium做些自动化(爬虫)的事,有几个人使用的是windows,配置环境搞了很久,服务跑起来了之后,用代码运行,又报了上面标题的错误。问题分析首先判断,这是一个python的错误,也就是说,不是appium本身的问题,那就从两点开始分析,要么是系统环境问题,要么是哪里的配置问题。先从配置的问题开始下手,毕竟新手一般都容易犯一些低级错误。但是拿着同事的代码在另一位同事的机器(osx)上跑,怎么都

    2022年10月1日
    3
  • python deepcopy函数_Python deepcopy

    python deepcopy函数_Python deepcopy我想为给定的SQLAlchemy映射类重写__deepcopy__,以便它忽略任何SQLA属性,但深入复制其他所有类的类.我并不是特别熟悉覆盖任何Python的内置对象,但我对我想要的东西有所了解.让我们创建一个使用SQLA映射的非常简单的类User.classUser(object):def__init__(self,user_id=None,name=None):self.user_i…

    2022年9月27日
    3
  • 树莓派3B安装Ubuntu 18.04

    树莓派3B安装Ubuntu 18.04树莓派3B安装Ubuntu18.04这里展示的是使用显示器的方法,不用ssh树莓派3b安装Ubuntu18.04完全遵照的Ubuntuwiki中的步骤。(1)下载并写入下载Ubuntu18.04LTS镜像文件:https://wiki.ubuntu.com/ARM/RaspberryPi,下载完后解压:ubuntu-18.04-preinstalled-server-armhf+…

    2022年6月25日
    53
  • pytest运行_python压测

    pytest运行_python压测前言pytest运行完用例之后会生成一个.pytest_cache的缓存文件夹,用于记录用例的ids和上一次失败的用例。方便我们在运行用例的时候加上–lf和–ff参数,快速运行上一

    2022年7月29日
    6
  • accept 函数_accept函数是阻塞的吗

    accept 函数_accept函数是阻塞的吗服务器要做的最普通的事情之一就是接受来自客户端的连接请求。在套接字上使用重叠I/O接受连接的惟一API就是AcceptEx()函数【注一】。有趣的是,通常的同步接受函数accept()的返回值是一个新的套接字,而AcceptEx()函数则需要另外一个套接字作为它的参数之一。这是因为AcceptEx()是一个重叠操作,所以你需要事先创建一个套接字(但不要绑定或连接它),并把这个套接字通过参数传给Acc

    2022年9月29日
    4
  • 在Ubuntu下编译Assimp库

    在Ubuntu下编译Assimp库

    2022年1月25日
    39

发表回复

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

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