在Android5.x中,Google对动画效果进行了更深一步的诠释,为Activity的转场效果设计了更加丰富的动画效果。
Android5.x提供了三种Transition类型。
1、进入:一个进入的过渡(动画)决定activity中的所有的视图怎么进入屏幕。
2、退出:一个退出的过渡(动画)决定一个activity中的所有视图怎么退出屏幕。
3、共享元素:一个共享元素过渡(动画)决定两个activities之间的过渡,怎么共享(它们)的视图。
进入和退出的效果包括:
explode(分解) –进或出地移动视图,从屏幕中间
slide(滑动) -进或出地移动视图,从屏幕边缘
fade(淡出) –通过改变屏幕上视图的不透明度达到添加或者移除视图(的效果)
使用步骤:
1.设置动画(两种方式):
a、xml设置
当你定义继承了material主题样式时,使用android:windowContentTransitions属性启用窗口的内容转换(效果)。你还可以指定进入、退出、和共享元素的转换:
<style name="myTheme" parent="android:Theme.Material">
<!-- 允许使用transitions -->
<item name="android:windowContentTransitions">true</item>
<!-- 指定进入和退出transitions -->
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowExitTransition">@transition/explode</item>
<!-- 指定shared element transitions -->
<item name="android:windowSharedElementEnterTransition">
@transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">
@transition/change_image_transform</item>
</style>
定义transition动画:
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<explode/>
<changeBounds/>
<changeTransform/>
<changeClipBounds/>
<changeImageTransform/>
</transitionSet>
b、代码设置
// 允许使用transitions
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
// 设置一个exit transition
getWindow().setExitTransition(new Explode());//new Slide() new Fade()
在这里需要注意:
(1)setExitTransition() - 当A start B时,使A中的View退出场景的transition
(2)setEnterTransition() - 当A start B时,使B中的View进入场景的transition
(3)setReturnTransition() - 当B 返回 A时,使B中的View退出场景的transition
(4)setReenterTransition() - 当B 返回 A时,使A中的View进入场景的transition
另外如果需要修改动画时长,可以这样:
Fade fade = new Fade();
fade.setDuration(2000);
getWindow().setExitTransition(fade);
2.Activity跳转方法
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
下面看一个实例demo:
具体代码:
第一个界面MainActivity.java
public class MainActivity extends Activity {
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_transition);
}
// 设置不同动画效果
public void explode(View view) {
intent = new Intent(this, Transitions.class);
intent.putExtra("flag", 0);
startActivity(intent,
ActivityOptions.makeSceneTransitionAnimation(this)
.toBundle());
}
// 设置不同动画效果
public void slide(View view) {
intent = new Intent(this, Transitions.class);
intent.putExtra("flag", 1);
startActivity(intent,
ActivityOptions.makeSceneTransitionAnimation(this)
.toBundle());
}
// 设置不同动画效果
public void fade(View view) {
intent = new Intent(this, Transitions.class);
intent.putExtra("flag", 2);
startActivity(intent,
ActivityOptions.makeSceneTransitionAnimation(this)
.toBundle());
}
activity_transition.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent">
<Button android:layout_width="match_parent" android:layout_height="100dp" android:onClick="explode" android:text="explode" />
<Button android:layout_width="match_parent" android:layout_height="100dp" android:onClick="slide" android:text="slide" />
<Button android:layout_width="match_parent" android:layout_height="100dp" android:onClick="fade" android:text="fade" />
</LinearLayout>
第二个界面Transitions.java
public class Transitions extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
int flag = getIntent().getExtras().getInt("flag");
// 设置不同的动画效果
switch (flag) {
case 0:
Explode explode = new Explode();
explode.setDuration(1000);
getWindow().setEnterTransition(explode);
break;
case 1:
Slide slide = new Slide();
slide.setDuration(1000);
getWindow().setEnterTransition(slide);
break;
case 2:
Fade fade = new Fade();
fade.setDuration(1000);
getWindow().setEnterTransition(fade);
getWindow().setExitTransition(fade);
break;
}
setContentView(R.layout.activity_transition_to);
}
但是,这个知识点我还有一个疑问,比如我需要从欢迎页过渡到首页,欢迎页动画过渡玩需要关闭,但是如果我直接加finish的话,过渡过程中会有一个退出的现象,希望有大神看到能帮我解决这个问题,谢谢~