安卓在5.0以后有一些新的动画:
- · Touch feedback(触摸反馈)
- · Reveal effect(揭露效果)
- · Activity transitions(Activity转换效果)
- · Curved motion(曲线运动)
- · View state changes(视图状态改变)
下面一个一个的来说
1.触摸反馈
顾名思义,触摸的时候给你一个反馈,最典型的就是Button默认的水波纹了,当使用了Material主题之后,波纹动画会自动安装到所有的控件上面。当然,我们也可以设置了,上面的第一种是设置波纹有边界,第二种是设置波纹超出边界。第二种需要5.0以上才行。
这里注意:除了Button外,如果像TextView这些控件,需要给予点击事件才能够有效果。1
2android:background="?android:attr/selectableItemBackground"
android:background="?android:attr/selectableItemBackgroundBorderless"


如果你觉得默认的颜色丑,那么你还可以自己区设置颜色,在drawable创建一个ripple的xml文件,android:background=”在这里引用就行”;
1 | <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="#ffff00" android:radius="200dp"> |
2.视图状态改变
除了这种水波纹之外,我们还可以定义自己的动画,使用android:stateListAnimator,这个东西,我们先看看效果:

像这个翻转动画就是我们自己定义的,使用这个也很简单,在animator下创建一个XML文件,看下面的代码你可会发现是一个objectAnimator,这个跟属性动画的xml编写是一样的,android:state_pressed=”true” 按下false为抬起。
1 | <?xml version="1.0" encoding="utf-8"?> |
我们怎么使用这个动画呢?两种方法第一代码实现,第种二配置android:stateListAnimator=”@nimator/XXX.xml“1
2StateListAnimator stateListAnimator= AnimatorInflater.loadStateListAnimator(getApplicationContext(),R.animator.asd);
textView.setStateListAnimator(stateListAnimator);
3.揭露效果

1 | Animator animator = ViewAnimationUtils.createCircularReveal(textView, |
方法的第一个参数是你要操作的view,第二个是原中心的X方向中点,第三个是圆Y方向的中点,第四个是原开始的半径,第五个是结束时候的半径。
4.曲线运动

曲线运动很容易,就是画一个贝塞尔曲线出来,然后沿着轨迹运动,他的使用方法跟属性动画一样。
1 | Path path = new Path(); |
5.Activity转换效果
在Android L之前,我们可以在startActivity之后调用overridePendingTransition来指定Activity的转场动画。现在Android L给我们带来了更绚丽的转场动画。
新的转场动画分为两大类,一种是普通的过渡动画,另一种是共享元素的过渡动画。 要想使用新的转场动画,可以继承Material Design主题后在style风格中指定:
1 | <style name="DefaultTheme" parent="android:Theme.Material"> |
也可以在activity的oncreate方法中进行代码设置:1
2
3
4
5
6
7
8
9
10
11
12// 允许使用transitions
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
// 指定进入、退出、返回、重新进入时的transitions
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
// 指定进入、退出、返回、重新进入时的共享transitions
getWindow().setSharedElementEnterTransition(new ChangeTransform());
getWindow().setSharedElementExitTransition(new ChangeTransform());
getWindow().setSharedElementReturnTransition(new ChangeTransform());
getWindow().setSharedElementReenterTransition(new ChangeTransform());
普通转场动画
所有继承自visibility类都可以作为进入、退出的过度动画。如果我们想自定义进入和退出时的动画效果,只需要继承Visibility,重载onAppear和onDisappear方法来定义进入喝退出的动画。系统提供了三种默认方式:
- explode 从屏幕中心移入或移出视图
- slide 从屏幕边缘移入或移出视图
- fade 改变视图的透明度
想在xml中指定自定义的进入、退出的过度动画需要先对动画进行定义:1
<transition class="my.app.transition.CustomTransition"/>
注意:其中CustomTransition是你自定义的动画,它必须继承自Visibility。
想以普通转场动画的方式启动一个Activity,必须在startActivity函数中传递一个ActivityOptions的Bundle对象:1
2ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity);
startActivity(intent, options.toBundle());
如果想让返回也具备转场效果,那么在返回的Activity中不要再调用finish函数,而是应该使用finishAfterTransition来结束一个Activity,该函数会等待动画执行完毕才结束该Activity。
共享转场动画
当两个Activity具备某些相遇的元素时,共享转场动画将是一个非常好的选择。使用转场动画需要将相同的元素通过android:transitionName或者view.setTransitionName设置为相同的名称,这样系统才能区分出相同的元素。
共享转场动画支持以下共享元素:
changeBounds 对目标视图的大小进行动画
changeClipBounds 对目标视图的剪裁大小进行动画
changeTransform 对目标视图进行缩放、旋转、位移动画
changeImageTransform 对目标图片进行缩放
通过下面的函数启动一个共享元素动画:1
2ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity, view, "name");
startActivity(intent, options.toBundle());
如果有多个共享元素,则可以通过Pair进行包装处理:1
2ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity,Pair.create(view1, "name1"),Pair.create(view2, "name2"));
startActivity(intent,.toBundle());
返回时如果需要具备转场动画,那么也需要用finish函数替代finishAfterTransition来结束一个Activity。
共享转场动画通常可以根据指定的元素判断出合适的转场动画效果,不需要我们做额外的处理,也可以通过之前学习的方法进行指定共享元素转场动画效果。
组合转场动画
我们可以把多个转场动画进行组合,作出更具个性的转场效果,在资源文件中通过以下方式:1
2
3
4
5<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<explode/>
<transition class="my.app.transition.CustomTransition"/>
<<changeImageTransform/>
</transitionSet>
代码中我们可以通过TransitionSet类组合多个转场动画:1
2
3TransitionSet transitionSet = new TransitionSet();
transitionSet.addTransition(new Fade());
transitionSet.addTransition(new ChangeBounds());
组合可以同时针对普通转场动画和共享元素转场动画。
转场动画也可以像普通动画一样设置持续时间,延期执行时间,速率插入器,以及动画的监听等。
转场动画通常是对整个布局起作用,如果我们想对某个特定的view实施转场动画,可以把该view设置为转场动画的target,这样转场动画将只对特定的view起作用。共享元素的动画的target需要指定为transitionName