Transition Animation系列文章:
- Android动画——Activity转场动画|过渡动画一点薄见(一)((Transition Animation 系列))
- android动画——过渡动画中ActivityOptions介绍与使用((Transition Animation 系列))
1. 序言
对于Android 5.0 之前,Android的过渡动画一般情况下使用:
overridePendingTransition(enterAnim, exitAnim);
android 5.0及以上,google提供了新的转场动画方式,及这里要介绍使用的ActivityOptions
,并且提供了兼容包ActivityOptionsCompat
。根据当前android版本的发展情况,本文就主要讲ActivityOptions
,其兼容包使用方法一样。
ActivityOptions
是一个静态类,提供了如下方法:
makeCustomAnimation(Context context, int enterResId, int exitResId)
makeScaleUpAnimation(View source, int startX, int startY, int width, int height)
makeThumbnailScaleUpAnimation(View source, Bitmap thumbnail, int startX, int startY)
makeSceneTransitionAnimation(Activity activity)
makeSceneTransitionAnimation(Activity activity, View sharedElement, String sharedElementName)
makeSceneTransitionAnimation(Activity activity, Pair<View, String>... sharedElements)
- 。。。。。。
ActivityOptions
的主要方法如上,这也是最主要的几种过渡方式,接下来将一一介绍各个方法的使用方式。
2. ActivityOptions使用
2.1 makeCustomAnimation
如果定义转场效果等,对于这方面如果不清楚的话,可以查看Android动画——Activity转场动画|过渡动画一点薄见(一)((Transition Animation 系列))的前半部分
使用方法:
ActivityOptions compat = ActivityOptions.makeCustomAnimation(this, R.anim.anim_activity_in, R.anim.anim_activity_out);
startActivity(new Intent(MainActivity.this, SecondActivity.class), compat.toBundle());
makeCustomAnimation
方法需要3个参数:
- 第一个参数:Context类型,也就是Activity。
- 第二个参数:int类型,新Activity显示动画。
- 第三个参数:int类型,当前Activity的退出动画。
这个方法与android 5.0之前的overridePendingTransition
类似,故使用较少。
备注:
- 启动activity的方式是使用
ActivityCompat.startActivity
- 如果调用
finish()
退出Activity,则需要调用finishAfterTransition()
进行退出动画
2.2 makeScaleUpAnimation
这个方法的转场效果时:
在新Activity会一某个点为中心,从某个大小开始逐渐放大到最大。
使用方法示例:
ActivityOptions compat = ActivityOptions.makeScaleUpAnimation(mImage, mImage.getWidth(), mImage.getHeight(),0,0);
startActivity(new Intent(MainActivity.this, SecondActivity.class), compat.toBundle());
这个方法有五个参数:
- 第一个参数:View类型,从那个View的坐标开始放大
- 第二个参数:int类型,指定相对于View的X坐标为放大中心的X坐标
- 第三个参数:int类型,指定相对于View的Y坐标为放大中心的Y坐标
- 第四个坐标:int类型,指定放大前新Activity是多宽
- 第五个坐标:int类型,指定放大前新Activity是多高
2.3 makeThumbnailScaleUpAnimation
该方法与上面一个方法类似,转场效果是:
放大一个图片,最后过渡到一个新的Activity
使用方法:
ActivityOptions compat = ActivityOptions.makeThumbnailScaleUpAnimation(mTextView,BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher),0,0);
startActivity(new Intent(MainActivity.this, SecondActivity.class), compat.toBundle());
该方法需有4个参数:
- 第一个参数:View类型,要放大的图片从哪个View的左上角的坐标作为中心点放大。
- 第二个参数:Bitmap类型,指定要放大的图片。
- 第三个参数:放大前图片的初始宽度
- 第四个参数:放大前图片的初始高度
2.4 makeSceneTransitionAnimation
使用方法:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
这个方法没什么可说的,就是简单的Activity转场
2.5 makeSceneTransitionAnimation(重点)
第二个这个方法是需要关注的重点,主要用于共享动画,关于共享动画的内容,可以查看Android动画——Activity转场动画|过渡动画一点薄见(一)((Transition Animation 系列))的共享动画部分
转场效果:
两个Activity的两个View协同完成转场,也就是原Activity的View过度到新Activity的View,原新两个Activity的View的
transitionName
相同。
使用方法:
Intent intent1 = new Intent(MainActivity.this, SharedElementActivity.class);
startActivity(intent1, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this,mImage,"image").toBundle());
activity_main.xml
和activity_shared_element.xml
的布局文件中都有一个ImageView,他们的android:transitionName
属性值是一样的。
这个方法有三个参数:
- 第一个参数:Context类型,指定Activity
- 第二个参数:View类型,指定从哪里过渡
- 第三个参数:String类型,过渡View的标志,即android:transitionName的属性值
2.6 makeSceneTransitionAnimation(重点)
转场效果:
前面一个方法是单个View协作转场,这个方法可以实现多个view协作转场
使用方法:
Intent intent = new Intent(MainActivity.this, SharedElementActivity.class);
Pair<View, String> p1 = Pair.create((View)textView1, "profile");
Pair<View, String> p2 = Pair.create((View)textView, "test");
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this,p1,p2).toBundle());
首先通过Pair.Create
静态方法创建两个Pair对象,这里有两个泛型,分别指定为View和String,Create方法接收,第一个参数是参与动画的Veiw,第二个是该View的transitionName,与前面的单一协作转场类似。