前言
在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
测试代码地址: