Activity过渡动画之ActivityOptionsCompat

/ 0评 / 1

前言

在Android 5.0之前,我们可以使用overridePendingTransition来改变Activity的过渡动画,在5.0以后,Google为我们添加了共享元素动画等新的过渡动画,为了简化开发者的适配,Google推出了ActivityOptionsCompat,通过ActivityOptionsCompat我们可以指定共享元素动画等,在5.0以上有效,5.0以下则使用默认效果,这样无疑简化了很多步骤,下面就来介绍下如果使用ActivityOptionsCompat

ActivityOptionsCompat常用方法

查看ActivityOptionsCompat的源码可以发现其提供了很多静态方法

//类似于overridePendingTransition
ActivityOptionsCompat.makeCustomAnimation(@NonNull Context context, int enterResId, int exitResId)
//设置新Activity在指定位置指定大小缩放到全屏
ActivityOptionsCompat.makeScaleUpAnimation(@NonNull View source, int startX, int startY, int startWidth, int startHeight)
//效果不详
ActivityOptionsCompat.makeThumbnailScaleUpAnimation(@NonNull View source, @NonNull Bitmap thumbnail, int startX, int startY)
//共享元素动画,指定View以及transitionName
ActivityOptionsCompat.makeSceneTransitionAnimation(@NonNull Activity activity, @NonNull View sharedElement, @NonNull String sharedElementName)
//同时在多个控件上面使用共享元素动画,使用Pair<View,String>来指定
ActivityOptionsCompat.makeSceneTransitionAnimation(@NonNull Activity activity, Pair... sharedElements)
//指定新Activity在指定位置从中心出现慢慢扩大小全屏
ActivityOptionsCompat.makeClipRevealAnimation(@NonNull View source, int startX, int startY, int width, int height)

但是根据我测试只有makeCustomAnimation、makeScaleUpAnimation、makeClipRevealAnimation、makeSceneTransitionAnimation的效果比较常用。

makeCustomAnimation

使用方式如下,效果类似于overridePendingTransition,可以改变Activity的过渡动画

ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeCustomAnimation(this, R.anim.slide_bottom_in, R.anim.slide_bottom_out);
Intent intent = new Intent(this, SecondActivity.class);
ActivityCompat.startActivity(this, intent, optionsCompat.toBundle());

makeScaleUpAnimation

设置新Activity在指定位置指定大小缩放到全屏,下面的例子是让Activity从被点击的View中间开始放大,不过有一个缺陷就是退出Activity不会缩放到被点击的View

private void makeScaleUpAnimation(View v) {
    ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, v.getWidth(), v.getHeight());
    Intent intent = new Intent(this, SecondActivity.class);
    ActivityCompat.startActivity(this, intent, optionsCompat.toBundle());
}

makeThumbnailScaleUpAnimation

按照文档解释是类似于makeScaleUpAnimation,只不过是放大一个图片,但是测试发现效果很奇怪,同样的,退出Activity的时候动画不可逆

private void makeThumbnailScaleUpAnimation(View v) {
    ActivityOptionsCompat optionsCompat = ActivityOptionsCompat
            .makeThumbnailScaleUpAnimation(v,
                    BitmapFactory.decodeResource(getResources(), R.drawable.h3), v.getWidth() / 2, v.getHeight() / 2);
    Intent intent = new Intent(this, SecondActivity.class);
    ActivityCompat.startActivity(this, intent, optionsCompat.toBundle());
}

makeClipRevealAnimation

新Activity从指定的位置从中心慢慢放大到全屏,同样的,退出Activity的时候动画不可逆

private void makeClipRevealAnimation(View v) {
    ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeClipRevealAnimation(v, v.getWidth() / 2, v.getHeight() / 2, v.getWidth(), v.getHeight());
    Intent intent = new Intent(this, SecondActivity.class);
    ActivityCompat.startActivity(this, intent, optionsCompat.toBundle());
}

共享元素过渡动画

对于共享元素过渡动画ActivityOptionsCompat提供了两个方法,分别作用与一个控件或者同时作用与多个控件。

对于共享元素动画,首先要知道两个Activity之间哪些元素是被共享的。有两种方式指定

1、android:transitionName指定

在新Activity的指定控件的xml中使用android:transitionName指定一个标记

2、ViewCompat.setTransitionName

在新Activity的onCreate中使用ViewCompat.setTransitionName手动设置transitionName

ViewCompat.setTransitionName(findViewById(R.id.testr), "23333");

单独一个元素

使用共享元素过渡动画需要指定View以及新Activity中目标View的transitionName,transitionName设置方法上面已经介绍过了

private void makeSceneTransitionAnimation(View v) {
    ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(this, findViewById(R.id.share_pic), "23333");
    Intent intent = new Intent(this, SecondActivity.class);
    ActivityCompat.startActivity(this, intent, optionsCompat.toBundle());
}

多个元素

要想在多个元素上面使用共享元素动画,需要使用Pair指定View以及transitionName,下面的例子中只使用了一个元素,可以传递多个Pair

private void makeSceneTransitionAnimation2(View v) {
    ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(this, Pair.create(findViewById(R.id.share_pic), "23333"));
    Intent intent = new Intent(this, SecondActivity.class);
    ActivityCompat.startActivity(this, intent, optionsCompat.toBundle());
}

参考链接:

https://developer.android.com/reference/android/support/v4/app/ActivityOptionsCompat

https://www.cnblogs.com/tianzhijiexian/p/4087917.html

测试代码地址:

https://github.com/CB2Git/ActivityOptionsTest

发表评论

您的电子邮箱地址不会被公开。