之所以写这篇文章是看到许多新人在处理Activity跳转的时候还是在使用进入进出动画,其实Google 在Android 5.0之后就提供了相应的转场动画,供我们实现更加炫酷的效果。 接下来直接进入正题,给大家详细的介绍一下转场动画的使用。
要使用这几种特殊的转场方式,首先我们要激活Activity 元素中的过度效果
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
注意:如果从 A->B ,那么该代码是在A中使用
接下来我们以一个简答的例子来对每一个转场动画做一个简单的介绍,要使用转场动画,肯定需要多个Activity,这里我们以MainActivity作为程序的主入口(其实页面很简单,就是几个Button ,点击不同的Button跳转到不同的Activty用以测试不同的转场动画)
先放代码,然后做解释
MainActivity 的布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
android:orientation="vertical"
tools:context="com.example.jin.myarttest.MainActivity">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="按钮1" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="按钮2" />
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="按钮3" />
<Button
android:id="@+id/button4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="按钮4" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/floating_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:transitionName="mybtn" />
<Button
android:id="@+id/btn_shenqi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="好神奇"
android:transitionName="btn" />
</LinearLayout>
MainActivity.class的代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private int NOTIFICATION_ID = 00000000;
private Button button1;
private Button button2;
private Button button3;
private Button button4;
private FloatingActionButton floating_btn;
private Button btn_shenqi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 激活Activity元素中的过度效果,一定要写在setContentView()方法之前
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
setContentView(R.layout.activity_main);
initView();
}
/**
* 初始化页面
*/
private void initView() {
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);
button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(this);
button3 = (Button) findViewById(R.id.button3);
button3.setOnClickListener(this);
button4 = (Button) findViewById(R.id.button4);
button4.setOnClickListener(this);
floating_btn = (FloatingActionButton) findViewById(R.id.floating_btn);
btn_shenqi = (Button) findViewById(R.id.btn_shenqi);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.button1:
/**
* 用以测试分解效果
*/
startActivity(new Intent(getApplicationContext(), Main2Activity.class), ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
break;
case R.id.button2:
/**
* 用以测试滑动效果
*/
startActivity(new Intent(getApplicationContext(), Main3Activity.class), ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
break;
case R.id.button3:
/**
* 用以测试淡入淡出效果
*/
startActivity(new Intent(getApplicationContext(), Main4Activity.class), ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
break;
case R.id.button4:
/**
* 用以测试共享元素效果
*/
//两个页面共享单个元素
// startActivity(new Intent(getApplicationContext(), Main5Activity.class), ActivityOptions.makeSceneTransitionAnimation(this,floating_btn,"mybtn").toBundle());
/**
* 共享多个元素
*/
startActivity(new Intent(getApplicationContext(), Main5Activity.class), ActivityOptions.makeSceneTransitionAnimation(
this,
Pair.create(((View) floating_btn), "mybtn"),
Pair.create(((View) btn_shenqi), "btn")).toBundle());
break;
}
}
}
1 分解动画需要在目标活动中设置
getWindow().setEnterTransition(new Explode().setDuration(500));
getWindow().setExitTransition(new Explode().setDuration(500));
2 滑动动画需要在目标Activity中设置
getWindow().setEnterTransition(new Slide().setDuration(500));
getWindow().setExitTransition(new Slide().setDuration(500));
3 淡入淡出效果需要在目标Activity中设置
getWindow().setEnterTransition(new Fade().setDuration(2000));
getWindow().setExitTransition(new Fade().setDuration(2000));
4 共享元素动画相比于其他三种动画稍微的复杂一些,首先,我们要给需要共享的元素设置transitionName属性并且两个需要共享的元素,transitionName必须相同。
共享元素动画又分为单个共享元素和多个共享元素
如果是单个共享元素,需要使用
startActivity(new Intent(getApplicationContext(), Main5Activity.class), ActivityOptions.makeSceneTransitionAnimation(this,floating_btn,"mybtn").toBundle());
其中第三个参数即是设置的transitionName的名字
假如有多个共享元素
/**
* 共享多个元素
*/
startActivity(new Intent(getApplicationContext(), Main5Activity.class), ActivityOptions.makeSceneTransitionAnimation(this,Pair.create(((View) floating_btn), "mybtn"),Pair.create(((View) btn_shenqi), "btn")).toBundle());