AndroidTransitionDemo

前端之家收集整理的这篇文章主要介绍了AndroidTransitionDemo前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Transition Animation是什么?

Android TransitionAnimation是Android 5.0 之后用于Activity之间的过渡动画效果

效果

<a href=图片描述" 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>
  1. TransitionHelper.createSafeTransitionParticipants()是我创建的一个Transition帮助类。new Pair()中的两个参数,第一个是参与Transition的View(我这里是一个ImageView),第二个参数是要启动的Activity中对应的View设置的TransitionName属性

  2. ActivityOptionsCompat.makeSceneTransitionAnimation()方法接收两个参数,第一个是Activity,第二个是Pair数组,既然是数组,就说明参与Transition的View可以有多个,只要再创建一个Pair对象,添加进Pair数组就行了。

  3. 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()));
      }

}

源码下载

猜你在找的程序笔记相关文章