android和androidx(Android之MotionLayout(一),MotionLayout的基本使用)
本文目录
- Android之MotionLayout(一),MotionLayout的基本使用
- Androidx和Android support库共存问题解决
- Android StudioBug积累(一)一次关于AndroidX引发的血案
- mumu模拟器安卓x和安卓6区别
- 新建的AndroidX项目改为Android示例
- Android-Lifecycle原理解析
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来监听生命周期的变化,然后在不同的生命周期做不同的操作。
更多文章:
诺基亚5630来电铃声(请大家帮忙找下诺基亚5630这款手机里的自带短信铃声Message 7.aac的下载网站!)
2024年7月24日 05:34
华为p20保时捷多少钱(华为p20和p20pro有什么区别)
2024年5月28日 03:40
索爱s500c软件下载(那个可以详细的告诉我怎么用手机下书和视频和主题啊!要步骤!谢谢!《索爱S500C》)
2024年10月13日 13:45
西门子洗衣机服务24小时热线(西门子洗衣机全国服务热线是多少)
2024年7月10日 13:55
摩托罗拉ex223怎么解锁(摩托罗拉ex223手机开机密码忘记了怎么办)
2024年1月20日 01:15
小米10刚上市价格是多少(曝小米将首发1.5亿像素镜头新机,小米10沦为百元机遭疯抢)
2023年8月9日 23:50
htc g17 rom(跪求!HTC G17从第三方ROM刷回官方RUU的方法,手机是行货)
2024年5月19日 18:13
诺基亚1682c手机(诺基亚1682c手机被锁密码了怎么解密)
2024年6月29日 15:07