在 5.0 上 提供了很多动画效果方面的 优化 和 设置
在android5.0(api21)及以上,允许自定义这些动画:
1. Touch feedback 触摸反馈
2. Circular Reveal 圆形显示
3. Activity transitions 过渡动画
4. Curved motion 曲线运动
5. View state changes 视图状态变化
3. Activity transitions activity过渡动画
android L还增加了一些activity的过渡动画——爆炸、滑动、淡入淡出,让应用更加平滑。使用这些动画,你必须在进入和退出activity都要求使用这些内容转场特效
3.1要实现效果,可以设置三种 transitions:
1. enter transition 进入动画
2. exit transition 退出动画
3. share transition 共享动画(在两个Activity间共享它们的activity transtion。比如,两个Activity有一个相同的图片,而位置和尺寸不同,使用changeImageTransform这个共享元素,能在Activity间平稳的转换和缩放图片。)
基本的效果有三种
android.transition.Explode //从场景的中心移入或移出
android.transition.Slide //从场景的边缘移入或移出
android.transition.Fade //调整透明度产生渐变效果
相应还有
android.transition.ChangeBounds;//View的布局的边界变化。
android.transition.ChangeClipBounds; //View的裁剪边界变化
android.transition.ChangeImageTransform; //目标图像的尺寸和缩放变化
android.transition.ChangeTransform; //View的旋转、缩放边界变化
使用示例:
(1) 设置 xml
<style name="myTheme" parent="android:Theme.Material">
<!-- 允许使用transitions -->
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowExitTransitionOverlap">true</item>
<!-- 指定进入和退出transitions -->
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowExitTransition">@transition/explode</item>
<!-- 指定shared element transitions -->
<item name="android:windowSharedElementEnterTransition">
@transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">
@transition/change_image_transform</item>
</style>
如果不在xml中设置,在代码设置 transitions的方法
// 允许使用transitions
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
// 设置一个exit transition 动画
getWindow().setExitTransition(new Explode());
(2) 定义transition动画:
使用方法和以前的AnimationSet差不多
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<explode/>
<changeBounds/>
<changeTransform/>
<changeClipBounds/>
<changeImageTransform/>
</transitionSet>
代码示例:
<changeBounds xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:interpolator="@android:interpolator/bounce" />
// new Explode()对应系统默认提供的动画 //android.transition.Explode //android.transition.Slide //android.transition.Fade //设置进入动画 setEnterTransition() //设置退出效果 setExitTransition() //设置共享元素的进入动画. setSharedElementEnterTransition() //设置共享元素的退出动画 setSharedElementExitTransition()
(3)启动Activity
当你已经设置了允许使用Transition并设置了Transition动画,你就可以通过ActivityOptions.makeSceneTransitionAnimation()方法启动一个新的Activity来激活这个
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
当Activity中设置了enter transtion,在其启动时,它将被激活。想要disable transitions,那么在启动这个Activity前 bundle传为 null:
startActivity(intent,null);
(4)共享元素跳转:
为了使有一个共享元素的两个activities间使用过渡动画:
1.在你的主题中启用窗口内容过渡(上面代码都有设置过)
2.在你的主题样式中指定共享元素的过渡(上面代码都有设置过)
3.定义你的过渡动画为XML资源
4.使用android:transitionName属性给两个布局中的共享元素指定一个相同的名字
5.使用ActivityOptions.makeSceneTransitionAnimation() 方法
跳转代码:
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this,view,"shareName").toBundle());
//多个对象
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
Pair.create(view1, "shareName1"),
Pair.create(view2, "shareName1"));
共享元素,一定要2个界面都有该元素指定一个相同的名字
<LinearLayout android:orientation="horizontal" android:elevation="2dip" >
<TextView android:elevation="8dip" android:transitionName="shareName" android:layout_width="50dp" />
</LinearLayout>
在代码中设置共享元素的名字:
view.setTransitionName(transitionName);
当需要结束当前Activity并回退这个动画时调用Activity.finishAfterTransition()方法
Activity.finishAfterTransition();
代码示例:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setEnterTransition( new Explode() );
getWindow().setExitTransition( new Explode() );
setContentView(R.layout.activity_explode_animation);
}
@Override
public void onBackPressed() {
super.onBackPressed();
finishAfterTransition();
}
(4)-> 2总体共享元素动画示例(来自网络):
创建 transtition 文件
<changeBounds xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:interpolator="@android:interpolator/bounce" />
xml 中设置 调用动画
2
<item name="android:windowSharedElementEnterTransition">@transition/changebounds</item>
<item name="android:windowSharedElementExitTransition">@transition/changebounds</item>
跳转代码,开启下一个activity
Intent intent = new Intent( this,SharedElementSecondAnimationActivity.class );
//设置父类容器视图setTransitionGroup为false
((ViewGroup)mImageView.getParent()).setTransitionGroup( false );
ByteArrayOutputStream stream = new ByteArrayOutputStream();
( (BitmapDrawable) mImageView.getDrawable() ).getBitmap().compress(Bitmap.CompressFormat.PNG, 100, stream);
intent.putExtra( "image", stream.toByteArray() );
ActivityOptions options;
try {
options = ActivityOptions.makeSceneTransitionAnimation( this, mImageView, "image" );
} catch( NullPointerException e ) {
Log.e( "SharedElementAnimationChangeBoundsActivity", "Did you set your ViewNames in the layout file?" );
return;
}
if( options == null ) {
Log.e("sharedelementanimation", "Options is null. Something broke. Good luck!");
} else {
startActivity(intent, options.toBundle());
}
3.2 监听可以在进入和退出动画生命周期中的特定点执行一些操作,给你更多让应用如何表现的控制权
getWindow().getEnterTransition().addListener( new Transition.TransitionListener {
@Override
public void onTransitionStart(Transition transition) {
}
@Override
public void onTransitionEnd(Transition transition) {
}
@Override
public void onTransitionCancel(Transition transition) {
}
@Override
public void onTransitionPause(Transition transition) {
}
@Override
public void onTransitionResume(Transition transition) {
}
});
兼容性:
调用这些api的时候先进行检查系统版本。