Activity动画
2016年9月9日
Activity Transition
Activity Transition是Material Design中提供的一种动画效果。它通过运动和切换不同状态之间的元素来产生各种动画效果。
主要步骤
- 在Style主题中启用Activity Transition。
- 定义Transition特效样式
- 在Activity中代码实现上面两步(手动实现配置文件的效果)
- 启动Activity
在Style主题中启用Activity Transition。
style.xml中添加如下属性
<!-- 允许使用transitions 必要* --> |
<item name="android:windowContentTransitions">true</item> |
为Activity进入和推出指定transitions样式
<!-- 指定进入和退出transitions --> |
<item name="android:windowEnterTransition">@transition/explode</item> |
<item name="android:windowExitTransition">@transition/explode</item> |
启动Activity方式为共享元素时 指定transitions样式
<!-- 指定shared element transitions --> |
<item name="android:windowSharedElementEnterTransition"> |
@transition/change_image_transform</item> |
<item name="android:windowSharedElementExitTransition"> |
@transition/change_image_transform</item> |
定义Transition特效样式
根据需求在@transition目录下创建样式文件 如上面change_image_transform和explode 常用的Transition特效
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> |
//进入和退出transitions效果 |
<explode/> //(爆裂) - 从场景中间移动视图进入或者退出 |
<slide/> //(滑动) - 视图从场景的一个边缘进入或者退出 |
<fade/> //(淡入淡出) - 从场景添加或者移除一个视图通过改变他的透明 |
//共享元素过渡transitions效果(shared element) |
<changeBounds/> // 改变目标视图的布局边界 |
<changeTransform/> // 裁剪目标视图边界 |
<changeClipBounds/> // 改变目标视图的缩放比例和旋转角度 |
<changeImageTransform/> // 改变目标图片的大小和缩放比例 |
</transitionSet> |
在Activity中代码实现
手动在Activity用代码实现配置文件的效果
// 允许使用transitions |
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); |
// 设置一个exit transition |
getWindow().setExitTransition(new Explode()); |
//设置一个进入 transition |
getWindow().setEnterTransition(new Fade()); |
启动Activity
当你已经设置了允许使用Transition并设置了Transition动画,你就可以通过ActivityOptions.makeSceneTransitionAnimation()方法启动一个新的Activity来激活这个Transition
启动普通的Transition
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle()); |
启用共享元素Transition
在所有需要共享视图的Activity中,使用android:transitionName属性对于需要共享的元素分配一个通用的名字。
Intent intent = new Intent(this, Activity2.class); |
// shareView: 需要共享的视图 |
// "shareName": 设置的android:transitionName="shareName" |
ActivityOptions options = |
ActivityOptions.makeSceneTransitionAnimation(this,shareView,"shareName"); |
startActivity(intent, options.toBundle()); |
如果有多个View需要共享,则通过Pair.create()方法创建多个匹配对然后传入ActivityOptions.makeSceneTransitionAnimation。
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, |
Pair.create(view1, "agreedName1"), |
Pair.create(view2, "agreedName2")); |
如果不想使用transition可以设置options bundle为null。 当需要结束当前Activity并回退这个动画时调用Activity.finishAfterTransition()方法