android和androidx(Android之MotionLayout(一),MotionLayout的基本使用)

2023-03-19 12:15:02 56

android和androidx(Android之MotionLayout(一),MotionLayout的基本使用)

本文目录

Android之MotionLayout(一),MotionLayout的基本使用

Android之MotionLayout(一),MotionLayout的基本使用
Android之MotionLayout(二),MotionScene的标签属性说明
Android之MotionLayout(三),用 MotionLayout 来做过渡动画,如何使用ConstraintSet
Android之MotionLayout(四),用 MotionLayout实现向上拉的折叠效果
Android之MotionLayout(五),如何使用 MotionLayout的自定义属性
Android之MotionLayout(六),如果使用Keyframes实现实现YouTube切换效果

MotionLayout 是一个 Google 官方出品用于制作 Android 中的过渡动画的框架。用来它就能轻松的做出一些较为复杂的动画效果
我们看一下效果图:

如果您使用了 AndroidX

如果您没有使用 AndroidX

由于 MotionLayout 类继承自 ConstraintLayout 类,因此可以在布局中使用 MotionLayout 替换掉 ConstraintLayout
MotionLayout 与 ConstraintLayout 不同的是:
MotionLayout 需要链接到一个 MotionScene 文件。使用 MotionLayout 的 app:layoutDescription 属性将 MotionLayout 链接到一个 MotionScene 文件。

在之前的 MotionLayout 示例中,app:layoutDescription 属性引用一个 MotionScene。MotionScene 是一个 XML 资源文件,其中包含相应布局的所有运动描述。为了将布局信息与运动描述分开,每个 MotionLayout 都引用一个单独的 MotionScene。请注意,MotionScene 中的定义优先于 MotionLayout 中的任何类似定义。

MotionScene 文件描述了两个场景间的过渡动画,存放在 res/xml 目录下。
要使用 MotionLayout 创建过渡动画,你需要创建两个 layout 布局文件来描述两个不同场景的属性。当从一个场景切换到另一个场景时,MotionLayout 框架会自动检测这两个场景中具有相同 id 的 View 的属性差别,然后针对这些差别属性应用过渡动画(类似于 TransitionManger)

MationLayout 除了支持上面列出的标准属性外,还支持全部的 ConstraintLayout 属性。

我们来分三步完成线面这个例子

场景1布局效果

场景2布局效果

编写完 MotionLayout 文件后就可以直接运行程序了。点击 image 即可进行场景切换。当进行场景切换时,MotionLayout 会自动计算出两个场景之间的差别,然后应用相应的过渡动画

Androidx和Android support库共存问题解决

1、添加第三方依赖时候报错。

Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory)from AndroidManifest.xml:22:18-86value=(androidx.core.app.CoreComponentFactory).    Suggestion: add’tools:replace=“android:appComponentFactory“’to element at AndroidManifest.xml:36:5-364:19to override.

经过各种折腾,终于get到, Androidx和Android support库不能共存

Androidx和Android support库共存截图

解决方案一 转换成Androidx

将build tools更新到3.2.0,gradle更新到4.6,依赖库统一更新到28.0.0 ,这一步非常重要,否则会导致第二步不能完全转换成功。
修改完成后,可以看到依赖库都是28.0.0的
选择工程右键→Refactor→Migrate to Androidx...
选中所有需要重命名的目录,执行Do Refactor
发现已经看不到support库了,运行成功安装app。

解决方案二 转换成Android Support

查看那些库依赖了Androidx,

找到了问题,果断回退这个依赖库的版本到2.1.4.

发现看不到androidx库了,运行成功安装app。

依赖库的时候,尽量不要使用latest.release,而使用具体的版本。

不会因为依赖库更新,引起兼容问题;

减少每次去查找最新版本,可以节省编译时间。**

Android StudioBug积累(一)一次关于AndroidX引发的血案

注:由于以下种种我都找到了合理完备的博客,所以在这一篇中便不做额外的分析,这次处理Bug也只是人生漫漫Bug路的一次缩影。所以说,我们要积极面对,永不言弃。
始发:清单文件类(Manifest)

mumu模拟器安卓x和安卓6区别

版本不同,兼容性不同。
1、版本不同,mumu模拟器安卓x是该模拟器的测试版本,而安卓6是该模拟器的正式版本。
2、由于安卓x是测试版本,仅支持光遇和幻塔两个游戏,安卓六能够兼容Android6.0内核的所有游戏。

新建的AndroidX项目改为Android示例

注:这里只是个成功的示例,compileSdkVersion和27.1.1有关,也可以换成你需要的

提供下颜色

清单AndroidManifest

Android-Lifecycle原理解析

Event触发的时机:

而在androidx.activity.ComponentActivity和androidx.core.app.ComponentActivity中,该方法的实现,其实都是一样的。

但是这两个Activity,其实都有自己的mLifecycleRegistry对象。

LifecycleRegistry对象其实可以理解为观察者模式中的Observable,也就是被观察者,而LifecycleRegistry对象的创建,其实是传入一个LifecycleOwner实现类对象,而androidx.activity.ComponentActivity和androidx.core.app.ComponentActivity实现了LifecycleOwner接口,所以传入的是this。

LifecycleRegistry中聚合了多个LifecycleObserver,生命周期改变时,通知LifecycleObserver进行相应方法的调用。
在LifecycleRegistry类中的addObserver方法中,其实就是通过封装LifecycleObserver生成了一个ObserverWithState对象,然后放入FastSafeIterableMap中,而FastSafeIterableMap其实就是一个自定义列表,用于保存观察者并且可在遍历期间处理删除/添加。
其实在自定义的某个类去实现LifecycleObserver接口的时候,在activity中,是需要通过getLifecycle().addObserver()进行注册的,这个过程其实就是调用了LifecycleRegistry的addObserver()方法。

ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);会将LifecycleObserver对象封装在ReflectiveGenericLifecycleObserver对象中。但是这里的需要判断是实现了哪个接口,比如androidx.activity.ComponentActivity中的构造函数中,因为是直接new LifecycleEventObserver匿名内部类实现接口对象,则isLifecycleEventObserver为true,就不会new ReflectiveGenericLifecycleObserver(),而在自定义一个类的时候,一般实现LifecycleObserver接口,则就会new ReflectiveGenericLifecycleObserver()

androidx.activity.ComponentActivity的构造函数:这里是new LifecycleEventObserver

自定义的BasePresenter:这里是实现LifecycleObserver接口

所以上面的两种不同的实现,BasePresenter实现的是LifecycleObserver,所以这个LifecycleObserver的最终实现是ReflectiveGenericLifecycleObserver。而ComponentActivity因为是new LifecycleEventObserver,所以这个匿名内部类对象就是最终实现。

在androidx.core.app.ComponentActivity的onCreate方法中,会调用

这里使用ReportFragment,如果是api29以及以上的,则可以直接注册回调来获取Activity的生命周期回调。如果是api29以下的,则需要手动给Activity添加一个空白的Fragment,类似于Glide监听生命周期回调的做法。

LifecycleCallbacks的定义如上,是在ReportFragment中定义的,其实就是使用了Application.ActivityLifecycleCallbacks来实现了。
其实就是在androidx.core.app.ComponentActivity中添加一个ReportFragment,而ReportFragment的生命周期方法,其实都调用了一个dispatch方法。

所以在ReportFragment的生命周期方法,其实就会通过调用对应的dispatch方法进而调用到了Activity的getLifecycle()方法获取到一个LifecycleRegistry对象,然后调用LifecycleRegistry的handleLifecycleEvent()方法。

这里需要事先获取到Activity的下一个生命周期状态,而这个状态过程其实与Fragment的类似,都是先升序,然后再降序的一个过程。即ON_CREATE是CREATED,ON_RESUME是RESUMED,然后ON_PAUSE是变成STARTED

而上面调用的sync()方法,其实其内部会调用两个方法backwardPass()和forwardPass(),一个是逆推,一个是顺推,其实就是可以认为一个是正序,一个是倒序。
比如forwardPass(),其实其内部就是遍历刚才缓存Observer的集合,找到每个Observer

而这里的dispatchEvent,其实就是ObserverWithState的方法,因为ObserverWithState内部封装了LifecycleEventObserver对象,而LifecycleEventObserver对象又是封装了LifecycleObserver对象的。

比如Activity的,其实onStateChanged是在androidx.activity.ComponentActivity的构造器中添加注册的LifecycleEventObserver监听接收对应的处理回调,在这里就会根据是ON_STOP还是ON_DESTROY进行回调的处理,也就是生命周期的处理。
这样的生命周期回调,在自定义类实现LifecycleObserver接口的时候,也可以采用注解的方式注册对应的LifecycleEventObserver监听,这样的生命周期的回调,其实就是回调到对应的注解和事件的方法中。这样是采用了类似于apt注解处理器的方式,生成了对应的java类

这里需要注意,如果是自定义添加监听的时候,是实现了LifecycleEventObserver,那么在分发的时候,调用ObserverWithState的dispatchEvent方法去分发,就会直接回调到了自定义LifecycleEventObserver实现类中的onStateChanged中;而如果是使用LiveData添加观察者的话,则是封装成LifecycleBoundObserver对象,然后通过其onStateChanged方法继续进一步的处理分发,调用到对应的Observer的onChanged方法进行最终的处理

如果这里的分发是分发到上面的那个自定义的BasePresenter,则需要经过ReflectiveGenericLifecycleObserver

从上面的原理解析,可以知道,Lifecycle的生命周期的感知和分发,其实也是依赖于一个ReportFragment,这其实也是一个空的Fragment,这样的做法,其实与Glide的生命周期的监听是类似的做法,都是采用一个空的Fragment来监听生命周期的变化,然后在不同的生命周期做不同的操作。

android和androidx(Android之MotionLayout(一),MotionLayout的基本使用)

本文编辑:admin
: android和androidx,

更多文章:


2022手机新品上市(vivo手机新款2022上市机型)

2022手机新品上市(vivo手机新款2022上市机型)

本文目录vivo手机新款2022上市机型vivo手机新款2022上市vivo手机新款2022上市机型硬核双芯,热血酷玩。iQOO Neo7已开启预约,产品参数配置信息请于10月20日19:00关注新品发布会。预约链接:网页链接可以进入viv

2024年5月14日 22:19

苹果笔记本2021价格(二手苹果笔记本推荐2021款的吗多少钱)

苹果笔记本2021价格(二手苹果笔记本推荐2021款的吗多少钱)

本文目录二手苹果笔记本推荐2021款的吗多少钱2021MacBook Pro 16寸降价了吗二手苹果笔记本推荐2021款的吗多少钱推荐,二手电脑当然是购买最新款的性价比最高啊,价格这方面你可以到专业的二手苹果电脑交易平台爱泡饭做相关的了解,

2024年4月20日 11:25

iphone12尺寸长宽高厘米(iphone12手机长度多少厘米)

iphone12尺寸长宽高厘米(iphone12手机长度多少厘米)

本文目录iphone12手机长度多少厘米苹果12宽度多少厘米iphone12手机长度多少厘米iphone12手机长度:14.67厘米。按照苹果官方网站给出的数据,苹果12型号的长度为14.67厘米(5.78英寸),宽度为7.15厘米(2.8

2024年6月30日 12:46

超级月亮是什么现象?超级月亮是真的嘛

超级月亮是什么现象?超级月亮是真的嘛

本文目录超级月亮是什么现象超级月亮是真的嘛超级月亮是什么意思请问一下超级月亮几点开始怎么拍超级月亮佳能80D要怎么调参数才能拍到今晚的月全食+蓝月亮+超级月亮怎样用小米手机拍摄超级月亮超级月亮是什么现象是一种新月或满月时月亮位于近地点附近的

2023年11月4日 03:45

dota2 steam下载(steam怎么下载dota2)

dota2 steam下载(steam怎么下载dota2)

本文目录steam怎么下载dota2请问steam上下载的dota2 和在在官网上下载的是一个吗dota2怎么从steam里下载steam怎么下国服dota2从steam上怎么下dota2在steam中怎么下dota2我在国服已经下了DOT

2023年11月20日 13:45

电信iptv机顶盒设置教程(电信IPTV机顶盒设置教程)

电信iptv机顶盒设置教程(电信IPTV机顶盒设置教程)

本文目录电信IPTV机顶盒设置教程如何将电视上如何从电信bestv切换iptv电信itv第一次使用,如何设置电信iptv要怎么设置使用呢中国电信网络机顶盒怎么设置电信ITV机顶盒怎么设置电信iptv机顶盒怎样设置电信IPTV机顶盒设置教程 

2023年7月22日 06:30

s450迈巴赫比s450区别(s450迈巴赫比s450区别)

s450迈巴赫比s450区别(s450迈巴赫比s450区别)

本文目录s450迈巴赫比s450区别奔驰s450和迈巴赫s450的区别是,s450迈巴赫比s450区别迈巴赫S450和奔驰S450的对比,迈巴赫优势非常明显。首先在尺寸上迈巴赫S450将近,5米5,而奔驰S450的长度还不到5米3。而且在配

2024年6月24日 06:00

荣耀x14和x15区别(为什么荣耀magicbookX15电池那么小)

荣耀x14和x15区别(为什么荣耀magicbookX15电池那么小)

本文目录为什么荣耀magicbookX15电池那么小荣耀笔记本NBR-WAI9和NMH-WFQ9HN型号有什么区别这俩款型号不同有区别吗为什么荣耀magicbookX15电池那么小摘要您好,您的问题我已经看到了,正在整理答案,请稍等一会儿哦

2023年11月5日 03:15

华硕p5g41tmlx主板详解(懂电脑的进!华硕p5g41t mlx这款主板怎么样)

华硕p5g41tmlx主板详解(懂电脑的进!华硕p5g41t mlx这款主板怎么样)

本文目录懂电脑的进!华硕p5g41t mlx这款主板怎么样华硕主板p5g41c-mlx主板4个硬盘接口分别什么意思华硕P5g41T-MLX华硕主板P5G41T-MLXV2是几代主板华硕主板P5G41T_MLX配那个cPU比较好的华硕p5g4

2024年6月11日 06:05

联想旭日主板电池在哪(联想笔记本旭日420A主板电池在哪)

联想旭日主板电池在哪(联想笔记本旭日420A主板电池在哪)

本文目录联想笔记本旭日420A主板电池在哪联想x1主板纽扣电池在哪联想笔记本旭日420A主板电池在哪你说的症状跟我的电脑以前的症状一样,我的是HP的,应该是主板问题。我的是最后拿去保修,换了主板,解决问题了,建议去保修,别嫌麻烦,自己弄不好

2024年5月6日 06:05

waxberry怎么读(杨梅的英语怎么读)

waxberry怎么读(杨梅的英语怎么读)

本文目录杨梅的英语怎么读Waxberry怎么读各种水果的英语单词怎么读杨梅的英语怎么读杨梅的英语为 waxberry,读作:英  waxberry英  n. 杨梅,杨梅果例句:We can also put the waxberry int

2024年5月24日 08:09

sanyo空调(sanyo空调没有遥控器怎么开制热风)

sanyo空调(sanyo空调没有遥控器怎么开制热风)

本文目录sanyo空调没有遥控器怎么开制热风sanyo空调遥控器图标型号rcs-w1c怎么制热sanyo空调遥控器怎么用万能空调遥控器怎么用三洋Qx一24空调压缩机具多大的sanyo空调遥控器装电池的地方旁边的小开关是用来做什么用的SANY

2024年5月15日 02:14

青岛手机号码网(手机号码132开头的是山东青岛移动号码还是联通号码)

青岛手机号码网(手机号码132开头的是山东青岛移动号码还是联通号码)

本文目录手机号码132开头的是山东青岛移动号码还是联通号码尾号66666!青岛一手机号卖了20.6万,主人一分没捞着, 你怎么看手机号码132开头的是山东青岛移动号码还是联通号码132号段属于联通,目前归属联通号段有:(仅取手机号码前三位)

2024年5月15日 18:56

火车票预订官网下载(下载12306网上订火车票官网下载安装)

火车票预订官网下载(下载12306网上订火车票官网下载安装)

本文目录下载12306网上订火车票官网下载安装12360火车票官网订票下载软件12356火车票官网下载12306火车票网上订票官网下载安装下载12306网上订火车票官网下载12306网上订火车票官网下载12306火车票网上订票如何下载下载1

2024年3月25日 02:15

拯救者电竞手机2pro跑分(拯救者电竞手机2Pro值得入手吗-拯救者电竞手机2Pro全面测评)

拯救者电竞手机2pro跑分(拯救者电竞手机2Pro值得入手吗-拯救者电竞手机2Pro全面测评)

本文目录拯救者电竞手机2Pro值得入手吗-拯救者电竞手机2Pro全面测评iQOO5和联想拯救者电竞手机pro哪个好-参数对比拯救者电竞手机2Pro拍照怎么样-拯救者电竞手机2Pro相机参数拯救者2Pro是曲面屏吗拯救者手机2pro是不是不关

2024年4月16日 14:20

近期文章

本站热文

电脑包尺寸对照表(电脑包要多大)
2024-07-02 11:29:03 浏览:3755
e10000(皖E10000是什么车)
2024-07-02 21:24:52 浏览:3498
ati radeon hd 5650(电脑的显卡是ATI Mobility Radeon HD 5650 (MADION PRO) ( 1 GB ) 这个显卡)
2024-06-26 03:11:22 浏览:3092
华为mate20pro版本区别(mate20pro有必要买ud版吗)
2024-07-02 22:04:37 浏览:2616
ipad买蜂窝版还是wifi版(ipad air 5买蜂窝好不好)
2024-06-26 01:03:39 浏览:2221
vivo y3配置参数(vivoy3参数是什么)
2024-07-02 21:50:09 浏览:2062
标签列表

热门搜索