在android 5.0之后我们可以使用google提供的Transition框架来实现Activity之间或者Fragment的动画变换效果。
虽然在之前的版本中,我们可以使用Activity的overridePendingTransition()和Fragment的setCustomAnimation()来实现Activity或者Fragment之间的动画切换,但是他们仅仅是将整个页面一起进行动画变换,显得比较生硬,而通过Transition,我们可以实现当第二个界面的出现方式与第一个界面有一定的关联性,例如视觉上让两个界面共享同一个元素,或者第二个界面动画开始的位置基于我们在第一个页面时候设置的值等等。
当我们需要使用Transition进行Activity之间的动画变换时,首先需要设置:
//设置允许通过ActivityOptions.makeSceneTransitionAnimation发送或者接收Bundle
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
//设置使用TransitionManager进行动画,不设置的话系统会使用一个默认的TransitionManager
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
Transition主要有退出(exit),进入(enter),返回(return),再次进入(reenter)四种变换,我们可以通过getWindow()然后进行设置,如下所示:
getWindow().setExitTransition(new Fade());
getWindow().setReenterTransition(new Explode());
getWindow().setEnterTransition(new Slide());
getWindow().setReturnTransition(new Fade());
假设我们通过ActivityA启动ActivityB,则这四种变化分别是指 :
1.ActivityA的退出变换(ExitTransition)决定了A调用B的时候,A中的View是如何播放动画的;
2.ActivityB的进入变换(EnterTransition)决定了A调用B的时候,B中的View是如何播放动画的;
3.ActivityB的返回变换(ReturnTransition)决定了在B返回A的时候,B中的View是如何播放动画的;
4.ActivityA的再次进入变换(ReenterTransition)决定了在B返回A的时候,A中的View是如何播放动画的。
然后我们可以在不同的状态变化中通过设置不同的效果,包括Fade(淡出),Explode(分解),以及Slide(滑动);
如果我们没有对Activity设置进入或这退出动画,但是如果开启了Transition框架,则系统会默认为其设置Fade动画效果,如果设置了进入或退出,但是没有设置返回或者再次进入,则返回变换会使用设置的进入变换效果,再次进入会使用其退出的变换效果。
使用的时候通过如下代码进行变换的开始:
Intent intent = new Intent(MainActivityA.this, MainActivityB.class);
ActivityOptions option = ActivityOptions.makeSceneTransitionAnimation(MainActivityA.this);
startActivity(intent, option.toBundle());
这样运行程序就能看到页面内容变换的动画了。
Transition框架不仅可以实现在内容变换时的动画效果,同时还可以设置在两个界面中的共享元素变换。
在程序中使用共享元素的动画效果非常简单,只需要分别为两个需要共享的元素设置相同的transitionName,并在ActivityOptions.makeSceneTransitionAnimation中将需要共享的元素作为参数传递过去即可。
例如我们需要共享ActivityA和ActivityB中的两个Image图片,则只需要分别为两个Image在布局文件中设置相同的transitionName:
android:transitionName="share_image"
需要注意两个transitionName一定要命名相同,这样系统才能找到共享元素。
如果我们只需要设置一个共享元素,那么在ActivityA中使用如下代码进行跳转:
Intent intent = new Intent(MainActivityA.this, MainActivityB.class);
ActivityOptions option = ActivityOptions
.makeSceneTransitionAnimation(MainActivityA.this,imageView,"share_image");
startActivity(intent, option.toBundle());
我们发现和之前内容变换使用的是相同的方法,只是在参数上多了共享的view和共享的变换名称,即之前设置的transitionName;
如果我们需要多个共享的元素,可以通过Pair.create()进行创建,如下所示:
ActivityOptions option = ActivityOptions.makeSceneTransitionAnimation(MainActivityA.this,
Pair.create(imageView, "share_image"),
Pair.create(button, "share_button"));
需要注意的是Pair.create()中的两个参数,第一个参数为需要共享的View,第二个参数为共享的名称,即各自的transitionName;在使用的时候发现对于不同的view如Button,ImageView都需要将其强转为View,才能作为Pair.create()的第一个参数。