Google在Android 5.0之后为了提高用户体验,增加了几种特殊的转场动画,简单的说也就是activity与activity之间进行跳转的动画效果,接下来对这几种动画效果做简要的说明
要使用这几种特殊的转场方式,首先我们要激活Activity 元素中的过度效果
使用代码
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
注意:此行代码只需在需要使用startActivity()方法的活动中使用
接下来我们以一个简答的例子来对每一个转场动画做一个简单的介绍,要使用转场动画,肯定需要多个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的代码如下
package com.example.jin.myarttest;import android.app.ActivityOptions;import android.content.Intent;import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.v7.app.AppCompatActivity;import android.util.Pair;import android.view.View;import android.view.Window;import android.widget.Button;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));
淡入淡出效果需要在目标Activity中设置
getWindow().setEnterTransition(new Fade().setDuration(2000)); getWindow().setExitTransition(new Fade().setDuration(2000));
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,
1. Pair.create(((View) floating_btn), "mybtn"),Pair.create(((View) btn_shenqi), "btn")).toBundle());