1.ActivityOptions
在Android2.0之前要实现Activity之间的过渡动画,使用的是overridePendingTransition。google在Android5.0提出了MD的设计风格,并扩充了Activity的转场动画,利用ActivityOptions和ActivityOptionsCompat可以实现新风格的转场动画。ActivityOptionsCompat是ActivityOptions的兼容包,虽然是兼容包但内部有的动画风格在5.0以下的版本依然不支持,只不过坚持在低版本使用ActivityOptionsCompat的动画不会出现crash。
ActivityOptionsCompat的主要作用是生成startActivity( Intent, Bundle) 所需要的Bundle,再配合其他方法实现转场动画。
ActivityOptionsCompat是一个静态类,提供了几个方法:
①ActivityOptionsCompat.makeCustomAnimation(Context context, int enterResId, int exitResId)
用户自定义动画,指定进入和退出动画。
enterResId:Activity进入动画资源id
exitResId:Activity退出动画资源id
比如,Activity1启动Activity2:
ActivityOptionsCompat compat = ActivityOptionsCompat.makeCustomAnimation(this,R.anim.translate_in, R.anim.translate_none);
ActivityCompat.startActivity(this, new Intent(this, Activity2.class), compat.toBundle());
在Activity2退出的时候调用ActivityCompat.finishAfterTransition(this)进行退出动画。
②ActivityOptionsCompat.makeScaleUpAnimation(View source,int startX, int startY, int startWidth, int startHeight)
放大一个view,然后显示新的activity,效果就是不断的放大一个view,进而进行activity的过度。
source:放大的view
startX,startY:从哪里开始缩放,以source为原点
width,height:新的activity从多大开始放大,如果是0,0则表示从最小开始。
ActivityOptions options = ActivityOptions.makeScaleUpAnimation(
view, 0, 0, //拉伸开始的坐标
view.getMeasuredWidth(), view.getMeasuredHeight()); // 初始的宽高
startActivity(intent, options.toBundle());
③ActivityOptionsCompat.makeThumbnailScaleUpAnimation(View source,Bitmap thumbnail, int startX, int startY)
放大一张图片,然后打开activity
source:参考原点
thumbnail:要放大的图片
startX,startY:从哪里开始放大,以source为坐标原点
Bitmap bitmap = view.getDrawingCache();
ActivityOptions options = ActivityOptions.makeThumbnailScaleUpAnimation(view, bitmap, 0, 0);
startActivity(intent, options.toBundle());
④ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity, View sharedElement, String sharedElementName)
两个activity中的某些view协同完成过渡动画,即共享元素过渡动画。
⑤ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity,Pair<View, String>… sharedElements)
多个共享元素过渡动画。。
Pair<View, String> imagePair = Pair.create(mImageView,"share1");
Pair<View, String> textPair = Pair.create(mTextView,"share2");
ActivityOptionsCompat compat = ActivityOptionsCompat.makeSceneTransitionAnimation(this, imagePair, textPair);
ActivityCompat.startActivity(this, new Intent(this, Activity2.class),compat.toBundle());
ActivityOptionsCompat提供了这5种过渡方式,使用时需要在theme指定:
<item name="android:windowContentTransitions">true
</item>
除了第一个指定了动画外,其他的好像没有机会去指定动画,如果想换一种动画呢?android提供了几种预设的动画方式,它们分别是change_bounds、change_clip_bounds、change_transition、change_image_transition、change_scroll。
首先需要在res目录下新建一个目录transition,然后在transition目录里新建xml文件,如果是change_bounds,则代码这么写:
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeBounds />
</transitionSet>
如果是change_clip_bounds,则代码这么写:
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeClipBounds />
</transitionSet>
其他的类似,那怎么指定使用这些xml呢?还需要在styles.xml文件中配置theme:
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="android:windowContentTransitions">true</item>
//指定进入和退出的动画可以重叠
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
//指定普通进入和退出的transition,这里使用了android预设的两个transition
<item name="android:windowEnterTransition">@android:transition/slide_bottom</item>
<item name="android:windowExitTransition">@android:transition/slide_bottom</item>
//指定使用sharedElement时的进入和退出动画,这里使用了自定义的transition
<item name="android:windowSharedElementEnterTransition">@transition/change_bounds</item>
<item name="android:windowSharedElementExitTransition">@transition/change_bounds</item>
</style>
</resources>
除此之外,还可以指定transition动画的速度插值器和动画时长:
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeBounds
android:interpolator="@android:interpolator/ accelerate_decelerate"
android:duration="500"/>
</transitionSet>
2.Transition
Transition的意思是过渡,这里指过渡动画。
Transition内部使用了属性动画来实现,所以它可以认为是属性动画的封装。Transition有两个核心概念为:场景(scenes)和变换(transitions),场景是UI当前状态,变换则定义了在不同场景之间动画变化的过程。所以Transition主要负责两个方面,一是保存开始和结束场景的两种状态,二是在两种状态之间创建动画。由于场景记录了内部所有View的开始和结束状态,所以Transition动画更具连贯性。而TransitionManager负责执行动画的任务。
使用Transition需要注意:
①使用Transition的activity需要启用transition ,有两种方法:
1)通过代码启用
在setContentView之前调用:
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
2)通过设置主题xml方式启用
<item na