Transition Animation是什么?
Android TransitionAnimation是Android 5.0 之后用于Activity之间的过渡动画效果。
效果图
图片描述" title="图片描述">
使用Transition Animation
从FirstActivity启动SecondActivity首先需要
1,在SecondActivity的Layout文件中给您想要有Transition效果的View设置一个android:transitionName="@string/transitionName
属性。
2,然后在FirstActivity中创建一个Pair
数组,调用ActivityOptionsCompat.makeSceneTransitionAnimation()
方法。
最后ActivityCompat.startActivity()
给View设置android:transitionName
属性
我这里图方便,就直接在根布局设置了
// 这个属性一定要设置
android:transitionName="@string/transitionName"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/background" />
启动Activity
private void startQuizActivityWithTransition() {
View translationView = findViewById(R.id.transitionView);
// 1
final Pair[] pairs = TransitionHelper.createSafeTransitionParticipants(this,false,new Pair<>(translationView,getString(R.string.transitionName)));
// 2
@SuppressWarnings("unchecked")
final Bundle transitionBundle = ActivityOptionsCompat
.makeSceneTransitionAnimation(this,pairs)
.toBundle();
Intent intent = new Intent(this,Main2Activity.class);
// 3
ActivityCompat.startActivity(this,intent,transitionBundle);
}</code></pre>
TransitionHelper.createSafeTransitionParticipants()是我创建的一个Transition帮助类。new Pair()中的两个参数,第一个是参与Transition的View(我这里是一个ImageView),第二个参数是要启动的Activity中对应的View设置的TransitionName属性
ActivityOptionsCompat.makeSceneTransitionAnimation()方法接收两个参数,第一个是Activity,第二个是Pair数组,既然是数组,就说明参与Transition的View可以有多个,只要再创建一个Pair对象,添加进Pair数组就行了。
ActivityCompat.startActivity():这个方法有三个参数,第一个是Activity;第二个是Intent;第三个是Bundle(将我们第二步得到的transitionBundle传入进去就行了);
TransitionHelper
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pair;
import android.view.View;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
-
创建transtions的帮助类,使用了{@link android.app.ActivityOptions}.
*/
public class TransitionHelper {
private TransitionHelper() {}
/**
-
创建Active Transition 过渡动画,避免与系统UI问题。
-
-
@param activity 用作启动transtion动画的activity
-
@param includeStatusBar 如果是 false,status bar 就不添加 transition 过渡动画
-
@return 所有添加了 transition 过渡动画的View的List.
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static Pair<View,String>[] createSafeTransitionParticipants(@NonNull Activity activity,boolean includeStatusBar,@Nullable Pair... otherParticipants) {
// 1,这里避免系统UI绘制问题:
View decor = activity.getWindow().getDecorView();
View statusBar = null;
if (includeStatusBar) {
statusBar = decor.findViewById(android.R.id.statusBarBackground);
}
View navBar = decor.findViewById(android.R.id.navigationBarBackground);
// 2,创建用于存储 transition 的pair集合.
List participants = new ArrayList<>(3);
addNonNullViewToTransitionParticipants(statusBar,participants);
addNonNullViewToTransitionParticipants(navBar,participants);
// 3,只有otherParticipants不为空且至少有一个,才添加进participants。
if (otherParticipants != null && !(otherParticipants.length == 1
&& otherParticipants[0] == null)) {
participants.addAll(Arrays.asList(otherParticipants));
}
// 4,返回添加了translation的数组
return participants.toArray(new Pair[participants.size()]);
}
/**
- 检查View不为空
- @param view 要添加transaction的View
- @param participants 存储transition的List
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static void addNonNullViewToTransitionParticipants(View view,List participants) {
if (view == null) {
return;
}
participants.add(new Pair<>(view,view.getTransitionName()));
}
}
源码下载