Transition Animation系列文章:
对于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... sharedElements)
ActivityOptions
的主要方法如上,这也是最主要的几种过渡方式,接下来将一一介绍各个方法的使用方式。
如果定义转场效果等,对于这方面如果不清楚的话,可以查看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个参数:
这个方法与android 5.0之前的overridePendingTransition
类似,故使用较少。
备注:
ActivityCompat.startActivity
finish()
退出Activity,则需要调用finishAfterTransition()
进行退出动画这个方法的转场效果时:
在新Activity会一某个点为中心,从某个大小开始逐渐放大到最大。
使用方法示例:
ActivityOptions compat = ActivityOptions.makeScaleUpAnimation(mImage, mImage.getWidth(), mImage.getHeight(),0,0);
startActivity(new Intent(MainActivity.this, SecondActivity.class), compat.toBundle());
这个方法有五个参数:
该方法与上面一个方法类似,转场效果是:
放大一个图片,最后过渡到一个新的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个参数:
使用方法:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
这个方法没什么可说的,就是简单的Activity转场
第二个这个方法是需要关注的重点,主要用于共享动画,关于共享动画的内容,可以查看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
属性值是一样的。
这个方法有三个参数:
转场效果:
前面一个方法是单个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,与前面的单一协作转场类似。