如果转载,请标明出处:https://blog.csdn.net/long117long/article/details/108295528
如何在navigation中的fragment之间使用Android Material中的动画?
Android Material的依赖是:implementation 'com.google.android.material:material:1.2.0'
先进行navigation的编写(这里不多说,假定已经完成了),
然后,在需要在跳转的地方加上:
exitTransition = MaterialElevationScale(true)
reenterTransition = MaterialElevationScale(true)
var extras = FragmentNavigator.Extras.Builder().addSharedElement(requireView(), "my_tran").build()
navController.navigate(R.id.action_A_to_B, null, null, extras)
需要注意的是,如果只是加上了这几行代码,会出现一个异常:java.lang.IllegalArgumentException: Unique transitionNames are required for all sharedElements
需要对requireView()添加一个属性值,"my_tran"。
这个属性值的添加有两种方式:
一种是代码添加:
requireView().transitionName = "my_tran"
另一种是在requireView()对应的布局上添加:
android:transitionName="my_tran"
这样运行起来就能看到动效了。
扩展:
假定:当前代码是在Fragment为A,要跳转进入的的Fragment是B。
代码中的:
exitTransition,是kotlin的写法,java的写法是:A.this.setExitTransition(new MaterialElevationScale(true))
reenterTransition 意思同上,java写法:setReenterTransition(...)
其中:
MaterialElevationScale 是 Android Material 带一种动画。
虽然 public void setExitTransition(Object transition)的参数transition是Object,但transition 是需要是 extend android.transition.Visibility的。
还有:
ExitTransition表示 在进入B时,A的动效是什么。
ReenterTransition表示 从B返回 A时, A的动效是什么。
另外:
如果在A中设置 enterTransition,returnTransition ,是看不到效果的。只要在B中(需要在onCreateView时)调用才能看到效果;记得,也要在B中设置transitionName 。
参看:
https://material.io/develop/android/theming/motion
https://www.jianshu.com/p/a24a6b96c5cd
如果转载,请标明出处:https://blog.csdn.net/long117long/article/details/108295528