Activity过渡动画之ActivityOptionsCompat
前言
在Android 5.0之前,我们可以使用overridePendingTransition来改变Activity的过渡动画,在5.0以后,Google为我们添加了共享元素动画等新的过渡动画,为了简化开发者的适配,Google推出了ActivityOptionsCompat,通过ActivityOptionsCompat我们可以指定共享元素动画等,在5.0以上有效,5.0以下则使用默认效果,这样无疑简化了很多步骤,下面就来介绍下如果使用ActivityOptionsCompat
ActivityOptionsCompat常用方法
查看ActivityOptionsCompat的源码可以发现其提供了很多静态方法
1 2 3 4 5 6 7 8 9 10 11 12 |
//类似于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的过渡动画
1 2 3 |
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
1 2 3 4 5 |
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的时候动画不可逆
1 2 3 4 5 6 7 |
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的时候动画不可逆
1 2 3 4 5 |
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
1 |
ViewCompat.setTransitionName(findViewById(R.id.testr), "23333"); |
单独一个元素
使用共享元素过渡动画需要指定View以及新Activity中目标View的transitionName,transitionName设置方法上面已经介绍过了
1 2 3 4 5 |
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
1 2 3 4 5 |
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
发表评论