*(这里建议使用xml来实现,统一了页面进入和退出动画的风格,修改也比较方便)
一:XML实现
1. 在style.xml中设置
<item name="android:windowContentTransitions">trueitem>
<item name="android:windowEnterTransition">@transition/explodeitem>
<item name="android:windowExitTransition">@transition/explodeitem>
<item name="android:windowReenterTransition">@transition/explodeitem>
<item name="android:windowReturnTransition">@transition/explodeitem>
2.在res下新建transition目录,在transition目录下创建所需要的过渡动画的xxx.xml,要选择标签为transition
explode.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<explode
android:duration="500"//动画所需要的时间
android:interpolator="@android:interpolator/accelerate_decelerate" />
transitionSet>
silde.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<slide
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
transitionSet>
fade.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<fade
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
transitionSet>
3.接下来就是重点了,如何跳转并让过渡动画生效
Intent intent = new Intent(MainActivity.this, SlideActivity.class);
//注意要调用两个参数的startActivity方法
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
4.好了一个进入或者退出的过渡动画就可以实现了
二:通过Java代码实现
1. 例如A跳转到B
2. A中的核心代码如下
Intent intent = new Intent(MainActivity.this, SlideActivity.class);
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
3.B中的核心代码如下,代码需要再setContentView之前
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
//getWindow().setReenterTransition(new Explode());
//getWindow().setReturnTransition(new Explode());
setContentView()
4.这样代码实现进入跟退出过渡动画就已经完成了
setSharedElementReturnTransition();B->A,B退出动画
一: XML实现
<item name="android:windowContentTransitions">trueitem>
<item name="android:windowSharedElementEnterTransition">@transition/share1item>
<item name="android:windowSharedElementExitTransition">@transition/share2item>
<item name="android:windowSharedElementReenterTransition">@transition/share3item>
<item name="android:windowSharedElementReturnTransition">@transition/share4item>
2.xml动画(res/transition/xxx.xml)
share1.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeBounds
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
transitionSet>
share2.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeClipBounds
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
transitionSet>
share3.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeTransform
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
transitionSet>
share4.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeImageTransform
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
transitionSet>
3.跳转代码
一个共享元素(该例子是讲button4设置为共享元素)
Intent intent3 = new Intent(MainActivity.this, Share1Activity.class);
startActivity(intent3, ActivityOptions.makeSceneTransitionAnimation(this, button4, "share").toBundle());
多个共享元素
startActivity(intent3, ActivityOptions.makeSceneTransitionAnimation(this, new PairString>(button4, "share"), new PairString>(button4, "share")).toBundle());
//new Pair()是可变参数
//共享元素的key:view控件 ,value:与android:transitionName="share" 相同(也可以通过代码设置setTransitionName())
二:Java代码实现
ChangeBounds -捕获共享元素的layout bound,然后播放layout bound变化动画。ChangeBounds 是
共享元素变换中用的最多的,因为前后两个activity中共享元素的大小和位置一般都是不同的。
ChangeTransform - 捕获共享元素的缩放(scale)与旋转(rotation)属性 ,然后播放缩放(scale)与旋转(rotation)属性变化动画。
ChangeClipBounds - 捕获共享元素clip bounds,然后播放clip bounds变化动画。
ChangeImageTransform - 捕获共享元素(ImageView)的transform matrices 属性,然后播放ImageViewtransform matrices 属性变化动画。与ChangeBounds相结合,这个变换可以让ImageView在动画中高效实现大小,形状或者ImageView.ScaleType 属性平滑过度。
1.例如仍然是从A跳到B
2.B中的代码
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setSharedElementExitTransition(new ChangeBounds());
//getWindow().setSharedElementEnterTransition(new ChangeBounds());
getWindow().setSharedElementReenterTransition(new ChangeBounds());
//getWindow().setSharedElementReturnTransition(new ChangeBounds());
setContentView()
3.具体的效果还是应该都敲敲看看,多敲才能真正理解,切勿眼高手低
参考:Android群英传,深入理解共享元素变换(Shared Element Transition)-上