在讲解5.0的activity的切换动画之前,先简单介绍一下5.0版本之前activity的切换动画。
1、5.0版本之前的Activity切换动画
在5.0之前activity的切换动画通过如下方式:
overridePendingTransition(int enterAnim, int exitAnim);
两个参数分别表示打开新Activity的动画,和当前Activity退出时的动画。如果是0表示当前没有动画。
正如官方文档中说的:此方法需要在startActivity(Intent intent)或者finish()之后立即被调用。
举例说明:
activity_first.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff0000"
>
<TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:text="first activity"
android:gravity="center"/>
<Button
android:layout_width="220dp"
android:layout_height="50dp"
android:text="translate"
android:onClick="translate"/>
<Button
android:layout_width="220dp"
android:layout_height="50dp"
android:text="scale"
android:onClick="scale"/>
<Button
android:layout_width="220dp"
android:layout_height="50dp"
android:text="rotate"
android:onClick="rotate"/>
<Button
android:layout_width="220dp"
android:layout_height="50dp"
android:text="alpha"
android:onClick="alpha"/>
</LinearLayout>
ActivityFrist.java
public class ActivityFirst extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
}
/**
*启动ActivitySecond及ActivitySecond打开的动画效果-平移
*/
public void translate(View view){
Intent intent = new Intent(this,ActivitySecond.class);
startActivity(intent);
overridePendingTransition(R.anim.activity_enter_translate,0);
}
public void scale(View view){
Intent intent = new Intent(this,ActivitySecond.class);
startActivity(intent);
overridePendingTransition(R.anim.activity_enter_scale,0);
}
public void rotate(View view){
Intent intent = new Intent(this,ActivitySecond.class);
startActivity(intent);
overridePendingTransition(R.anim.activity_enter_rotate,0);
}
public void alpha(View view){
Intent intent = new Intent(this,ActivitySecond.class);
startActivity(intent);
overridePendingTransition(R.anim.activity_enter_alpha,0);
}
}
activity_enter_translate.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="100%"
android:toYDelta="0"></translate>
</set>
只贴出一个平移动画的代码,其他的类似,毕竟本文不是讲动画的。以上就是新Activity进入的动画
再举例Activity退出动画,布局文件及动画文件不贴了,主要贴Activity的。
ActivitySecond.java
public class ActivitySecond extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
public void translate(View view){
finish();
overridePendingTransition(0,R.anim.activity_exit_translate);
}
public void scale(View view){
finish();
overridePendingTransition(0,R.anim.activity_exit_scale);
}
public void rotate(View view){
finish();
overridePendingTransition(0,R.anim.activity_exit_rotate);
}
public void alpha(View view){
finish();
overridePendingTransition(0,R.anim.activity_exit_alpha);
}
}
以上就是5.0之前的activity间切换动画
2、5.0版本之后的Activity切换动画
5.0内置了三种切换动画,分别是explode(分解)、slide(滑出)、fade(淡出)。
getWindow().setEnterTransition(new Explode());
getWindow().setEnterTransition(new Slide());
getWindow().setEnterTransition(new Fade());
效果如下
explode的(分解)————从屏幕中间进入或退出
关键代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
//打开下一级activity时,此activity的退出动画
getWindow().setExitTransition(new Slide());
setContentView(R.layout.activity_main);
}
代码getWindow().setExitTransition(new Slide());是设置当前activity的开启新activity时,当前activity的退出动画;而新开activity的进入动画的设置需将方法startActivity(Intent intent)换成startActivity(Intent intent,Bundle options),如下:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
然后再在即将开启的activity中设置动画效果,如下:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
//设置此activity进入的动画---分解
getWindow().setEnterTransition(new Explode());
//设置此动画显示的时机
// false:需要等上一个activity的退出动画显示完成后,才开启此activity的进入动画;
// true:不必等上一个activity的退出动画执行完,就开始此activity的进入动画;
getWindow().setAllowEnterTransitionOverlap(false);
setContentView(R.layout.activity_second);
}
还可以设置activity响应物理返回键的时候的动画
getWindow().setReturnTransition(new Fade());
如果不设置物理键返回动画的话,默认会和进入动画是同一个。
其他的两个(slide和fade)用法和explode相似。接下来讲解一下共享元素
共享元素
还有一种动画效果就是上图中的第四种,将两个Activity中的某个view设置为共享元素。共享元素之间就会有一个过度动画。使用起来很简单:
1、将ActivityA中某个view设置为共享元素,只需要给共享元素增加如下属性:
android:transitionName="share"
2、在ActivityA中启动ActivityB的时候,设置共享元素:
//单个共享元素
//startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, view,"share").toBundle());
//多个共享元素
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, Pair.create(view,"share"),Pair.create(btn,"share_two")).toBundle());
其中view和btn均为要共享的View对象,而“share”和“share_two”均为控件中设置的android:transitionName="share"
name,
3、在ActivityB中,将要设置为共享元素的控件同样添加android:transitionName="share"
此属性。
ps:共享元素要配合之前的三种动画使用
以上:如果讲错的地方欢迎指正