Transitions between Activities
过渡动画作用于正在退出Activity
的内容
当从Activity A
跳转到Activity B
,内容布局将根据定义好的过渡做动画变换,在android
过渡动画预先定义了三种过渡动画,分别是Explode
,Slide
和Fade
,这些过渡动画会跟踪当前设置的View
,并执行相应的动画。
[Explode] | [Slide] | [Fade] |
---|---|---|
我们可以通过xml方式和代码的方式定义过渡动画,例如FADE
过渡动画
xml方式
过渡动画定义在res/transition
下
res/transition/activity_fade.xml
<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/"
android:duration="1000"/>
res/transition/activity_slide.xml
<?xml version="1.0" encoding="utf-8"?>
<slide xmlns:android="http://schemas.android.com/apk/res/"
android:duration="1000"/>
为了使用上面定义的过渡动画,我们需要用到TransitionInflater
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_transition);
setupWindowAnimations();
}
private void setupWindowAnimations() {
Slide slide = TransitionInflater.from(this).inflateTransition(R.transition.activity_slide);
getWindow().setExitTransition(slide);
}
TransitionActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_transition);
setupWindowAnimations();
}
private void setupWindowAnimations() {
Fade fade = TransitionInflater.from(this).inflateTransition(R.transition.activity_fade);
getWindow().setEnterTransition(fade);
}
代码方式
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_transition);
setupWindowAnimations();
}
private void setupWindowAnimations() {
Slide slide = new Slide();
slide.setDuration(1000);
getWindow().setExitTransition(slide);
}
TransitionActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_transition);
setupWindowAnimations();
}
private void setupWindowAnimations() {
Fade fade = new Fade();
fade.setDuration(1000);
getWindow().setEnterTransition(fade);
}
上面的两种方式都会变成这样的效果:
这过程中做了下面几件事
- Activity A 启动 Activity B
- 过渡动画找到了A的
Exit Transition (slide)
并应用到它的所有可见的View
上 - 过渡动画找到了B的
Enter Transition (fade)
并应用到他的所有可见的View
上 - 退出当前页面,执行
On Back Pressed
方法,过渡动画会分别执行Enter
和Exit
的相反动画(如果已经定义了returnTransition
和reenterTransition
,那么就会执行returnTransition
和reenterTransition
作为代替)
ReturnTransition & ReenterTransition
returnTransition
和reenterTransition
分别是ExitTransition
和EnterTransition
相反的动画
- EnterTransition <–> ReturnTransition
- ExitTransition <–> ReenterTransition
如果没有定义returnTransition
和reenterTransition
,Android
会执行ExitTransition
和EnterTransition
的相反动画,但是如果你定义了他们,你将拥有进入和退出activity
是不同的过渡动画。
现在,我们修改之前的Fade
例子,并且给TransitionActivity
定义ReturnTransition
,那么当从B
到A
,我们将看到一个滑出(slide out
)动画(之前是渐变(Fade out),它是 EnterTransition
的相反动画)
TransitionActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_transition);
setupWindowAnimations();
}
private void setupWindowAnimations() {
Fade fade = new Fade();
fade.setDuration(1000);
getWindow().setEnterTransition(fade);
Slide slide = new Slide();
slide.setDuration(1000);
getWindow().setReturnTransition(slide);
}
观察,如果没有定义ReturnTransition
那么EnterTransition
的相反动画将会执行,如果定义了Return Transition
,那么EnterTransition
的相反动画将会被代替。
没有定义 Return Transition | 定义了 Return Transition |
---|---|
Enter: Fade In | Enter: Fade In |
Exit: Fade Out | Exit: Slide out |