紧接着上一篇介绍了Scene和Transition的基本用法后,这篇开始介绍如何运用这些到转场动画中。从A页面到B页面,再从B页面返回到A页面,这就是一个完整的转场过程。而转场动画就是负责来优雅地协调处理好这个过程的。android
Content Transition就是最多见的转场动画了。为了方便你们理解,咱们先来上个图。bash
Slide slide=new Slide();
slide.setDuration(3000);
slide.setSlideEdge(Gravity.BOTTOM);
getWindow().setExitTransition(slide);
Explode explode = new Explode();
explode.setDuration(3000);
explode.setMode(Visibility.MODE_IN);
getWindow().setReenterTransition(explode);
复制代码
Slide slideEnter=new Slide();
slideEnter.setDuration(1500);
slideEnter.setSlideEdge(Gravity.RIGHT);
getWindow().setEnterTransition(slideEnter);
Slide slide=new Slide();
slide.setDuration(1500);
slide.setSlideEdge(Gravity.RIGHT);
getWindow().setReturnTransition(slide);
复制代码
而后在A页面调用方法跳到B页面:ide
Intent intent = new Intent(this, BActivity.class);
ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(this);
startActivity(intent, activityOptionsCompat.toBundle());
复制代码
能够看到一共能够设置四个Transition:布局
(1)setExitTransition() - 当A 跳转到 B时,A中的View退出场景的效果(默认Null)post
(2)setEnterTransition() - 当A 跳转到 B时,B中的View进入场景的效果(默认Fade)动画
(3)setReturnTransition() - 当B 返回 A时,B中的View退出场景的效果(默认同EnterTransition)ui
(4)setReenterTransition() - 当B 返回 A时,A中的View进入场景的效果(默认同ExitTransition)this
以上这个过程一样能够看作是Transition做用在Scene上的一系列效果,只不过这里的Scene从上一篇中的单一布局换成了Window。不过细心的同窗可能发现了,明明我为四个过程都设置动画效果,可为何ExitTransition没有生效呢?接下来咱们为每一个Transition加入监听,看看动画的执行流程。下面是其中一个的代码,其余三个都同样:spa
Explode explode = new Explode();
explode.setDuration(3000);
explode.setMode(Visibility.MODE_IN);
explode.addListener(new Transition.TransitionListener(){
@Override
public void onTransitionStart(Transition transition) {
Log.d("Transitions--","ReenterTransitionStart");
}
@Override
public void onTransitionEnd(Transition transition) {
Log.d("Transitions--","ReenterTransitionEnd");
}
@Override
public void onTransitionCancel(Transition transition) {
}
@Override
public void onTransitionPause(Transition transition) {
}
@Override
public void onTransitionResume(Transition transition) {
}
});
getWindow().setReenterTransition(explode);
复制代码
再次执行程序,日志信息以下: 3d
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setWindowAllowReturnTransitionOverlap(false);
复制代码
或者在主题文件全局设置这个属性,这样无疑更好,即减小了代码又保证了应用视觉效果的统一:
<item name="android:windowAllowEnterTransitionOverlap">false</item>
<item name="android:windowAllowReturnTransitionOverlap">false</item>
复制代码
修改后效果以下:
保持上面的打印信息不变,咱们增长两个Activity的生命周期日志信息,串行结果以下:
onBackPressed()
才会有ReturnExitTransition。看源码就很明显了:public void onBackPressed() {
if (mActionBar != null && mActionBar.collapseActionView()) {
return;
}
if (!mFragments.getFragmentManager().popBackStackImmediate()) {
finishAfterTransition();
}
}
复制代码
最后简单分析下转场动画的大体流程(以slide为例),看过上一篇文章的同窗应该很好理解:
1.从DecoerView开始,依次遍历得到当前Window上的视图树里的全部View
2.执行captureStartValues(TransitionValues transitionValues),捕获View开始状态的一些属性(visibility,Parent,LocationOnScree)
3.设置全部的VIew为INVISIBLE。
4.执行captureEndValues(TransitionValues transitionValues),捕获View结束状态的一些属性(visibility,Parent,LocationOnScree)
5.比较属性的不一样,建立属性动画。下一个过程就是返回属性动画并执行了。
复制代码
这是ExitTransiton的流程,其余三个也差很少。下一篇将会讲带共享元素的转场动画,也是material design中颇有特点的动画了。