属性动画详细解析

属性动画的特征:
Duration(持续时间):你可以自定义,默认情况下是300ms
Time interpolation(时间插值):您可以指定属性的值是如何计算该动画的当前运行时间的函数。
Repeat count and behavior:可以自定义重复的次数以及相关的一些动作
Animation sets:你可以将多个动画成为一个组合,一起播放或者延迟间隔的播放以及顺序播放。
Frame refresh delay(帧刷新延迟):你可以指定每一帧的属性时间,默认是10ms刷新一次,最终还是要取决于你手机性能

Property Animation 与 View Animation不同之处

视图动画(View Animation),只对于View对象,如果要在非View对象实现动画,需要实现相关的方法,而且只能实现像缩放、位移,透明度等而无法改变背景颜色。另一个不好的地方就是它只能修改绘制视图,并不是View本身,例如让一个button做平移运动,在平移过程中,初始的位置依然可以点击,如果你想跟随着动画的位置进行点击,那需要自己去处理实现。
属性动画(Property Animation),没有了View动画的那些限制,你可以给任何一个View或者不是View的对象进行动画,而且View它自身也得到了真正的修改。在一个较高的水平,你要进行动画处理的属性指定动画,如颜色、位置或大小,可以定义如插值和多个动画的同步动画的各个方面。
View动画相对与Property 动画,只需要更少的时间和代码量,如果已经能够满足你应用的要求了,那么就可以不用属性动画了,当然你也可以在不同的地方用不同的动画,随机应变。

在使用动画时,一般不直接使用Animation这个类,因为提供的功能相对较少,通常情况下都是使用它的子类:ValueAnimation、ObjectAnimation和AnimationSet。
ValueAnimation 属性动画的主要计时引擎,还计算要进行动画处理的属性值。它包含了所有动画的核心功能,包含了每一个动画的详细信息。信息包括了动画是否重复,监听收到更新的事件,和设置自定义类型评价的能力。有两种动画属性:计算经过动画处理的值,正在被动画时,在对象设置这些值和属性用于动画。ValueAnimator不执行第二部分,所以你必须监听ValueAnimator所计算的值更新和修改要进行动画处理的对象与您自己的逻辑。
ObjectAnimation 是ValueAnimation的子类,允许你设置目标的属性进行动画,当动画的计算新值时,此类更新相应的属性。大部分情况使用的是ObjectAnimator,因为它实现动画的过程更加容易。然而,有时你需要直接使用ValueAnimator因为ObjectAnimator有更多限制,例如你需要访问每个目标的方法。
AnimationSet 动画集,通过的组合动画的机制,他们相互联系着运行,你可以同时播放动画,也可以连续的或者有时延间隔的进行播放。
Evaluators(评估者) 告诉属性动画系统计算给定属性的值,他们获取计时数据,它提供了一个动画类,动画的开始、结束的值和基于此数据计算动画处理的值。属性动画提供了如下几种Evaluators:

这里写图片描述

Animating with ValueAnimation

ValueAnimation 或者类使你的动画以某种类型,在持续的时间能按照设置的int,float或者color值进行播放。
例如

ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();

在代码中当开始运行时,ValueAnimation开始计算animation的值,在0到1之间,持续时间是1000ms。
你也可以自定义Animation的类型:

lueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
animation.setDuration(1000);
animation.start();

在代码中,当动画运行时,animation在1000ms内通过MyTypeEvaluator的逻辑进行计算startPropertyValue 和endPropertyValue之间的值。
上面的代码片段,然而,没有真正的对对象造成影响,因为ValueAnimator不直接操作的对象或属性。最可能的情况是你想要做的是修改对象与这些计算要进行动画处理的值。为此你要定义监听器中ValueAnimator处理在动画的生命期间,如帧更新。当实现监听器时你可以获取计算的值,可以得到每一帧刷新的值同getAnimatedValue()。

Animating with ObjectAnimator

ObjectAnimation是ValueAnimator的子类。结合ValueAnimator的计时引擎和计算值与目标对象的命名属性进行动画处理的能力。这使得动画更加的简单,你不需要实现ValueAnimator.AnimatiorUpdateListener,因为动画属性自动更新了。
实例化一个ObjectAnimator是类似于ValueAnimator,但您还可以指定对象和该对象的属性的名称(字符串形式)和值之间要进行动画处理

ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);
anim.setDuration(1000);
anim.start();

为了ObjectAnimation能够正确的更新属性,你需要如进行以下做法:
1、在对象属性你必须要在set()设置函数,因为ObjectAnimation是自动更新属性的。它必须能够访问该属性与这个setter方法例如,如果属性名称foo,你需要有一个setFoo()方法。如果这个setter方法不存在,你们有三种选择:
· Add the setter method to the class if you have the rights to do so.
· Use a wrapper class that you have rights to change and have that wrapper receive the value with a valid setter method and forward it to the original object.
· Use ValueAnimator instead.
2、如果你仅指定在ObjectAnimation工厂方法中values…参数的一个值。那么这就是动画结束值。因此,在目标参数,你是动态的必须有个getter方法用于获取动画开始的值,这个getter方法必须以get()的形式存在。例如,属性名字是foo,你必须有个getFoo()方法。
3、getter(如果有必要的话)和setter方法进行动画处理的属性必须运作于同一类型,指定ObjectAnimation的开始和结束值。例如,如下构造ObjectAnimation,你必须有targetObject.setPropName(float) and targetObject.getPropName(float):

ObjectAnimator.ofFloat(targetObject, "propName", 1f)

4、取决于你是什么样的属性或对象进行动画处理,可能你需要调用invalidate()方法,在一个View时屏幕重绘,更新动画的值。你在onAnimationUpdate()调用。在所有视图属性的setters方法,例如setAlpha()、setTranslationX()时就不需要调用invalidate了。

Choreographing Multiple Animations with AnimatorSet

在很多情况,你想要播放一个动画取决于当另一个动画的开始或者结束,android系统提供了AnimatorSet方法,将多个动画捆绑在一起。所以你可以指定动画的播放形式,一起、连续、指定延长的播放。你也可以AnimatorSet互相嵌套着使用。
举个例子发挥以下播放情况:
Plays bounceAnim.
Plays squashAnim1, squashAnim2, stretchAnim1, and stretchAnim2 at the same time.
Plays bounceBackAnim.
Plays fadeAnim.

AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();

Animation Listeners

在动画期间你可以监听期间重要的事件,做法如下:

返回动画的每一帧。监听这个事件使用由ValueAnimator这个动画时产生。 To use the value, query the ValueAnimator object passed into the event to get the current animated value with the getAnimatedValue() method. Implementing this listener is required if you use ValueAnimator.

如果你不想实现Animator.AnimatorListener的所有方法,你可以通过继承AnimatorListenerAdapter类代替实现Animator.AnimatorListener接口。
例如Bouncing Balls 例子创建一个AnimatorListenerAdapter,仅在onAnimationEnd()回调:

ValueAnimatorAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
fadeAnim.addListener(new AnimatorListenerAdapter() {public void onAnimationEnd(Animator animation) {
    balls.remove(((ObjectAnimator)animation).getTarget());}

Animating Layout Changes to ViewGroups

属性动画系统支持更改ViewGroup对象进行动画处理的能力,也是视图对象自己更容易的方法进行动画。
你可以利用LayoutTransition类在ViewGroup中对animate layout进行改变。
You can define the following animations in a LayoutTransition object by calling setAnimator() and passing in an Animator object with one of the following LayoutTransition constants:

这四个事件自定义的外观布局转换的类型,您可以定义您自己的自定义动画,或者仅仅使用系统默认的属性动画
你想要在对应的Layout设置设置android:animateLayoutchanges属性设为true。
Setting this attribute to true automatically animates Views that are added or removed from the ViewGroup as well as the remaining Views in the ViewGroup.
设置此属性为 true,自动进行View的动画,从ViewGroup中被添加或者移除,剩下现有的View在ViewGroup中

Using Interpolators(使用插值器)

一种插补器定义如何计算特定动画中的值作为时间的函数。例如,你可以指定横穿整个动画的动画。意味着动画均匀的移动,或者指定动画非线性的移动,例如在动画的开始加速在结尾减速动画。
Android系统在 android.view.animation package.提供了一设置公共的interpolators,当然你也可以通过实现TimeInterpolator接口创建自己的Interpolators
这里写图片描述
这里写图片描述

Specifying Keyframes

实例化一个Keyframe对象,你必须使用工厂方法之一,ofInt(),ofFloat() or ofObject()获取Keyframe恰当的类型。然后你调用ofKeyframe()工厂方法获取一个PropertyValuesHolder对象。一旦你有了这个对象,你可以获取一个animator通过传递PropertyValuesHolder和动画对象如下代码:
这里写图片描述

Animating View

属性动画允许流线型动画View对象,属性动画能够通过改变View的真实属性:
这里写图片描述
动画视图的对象,例如颜色或者旋转只,所有你想要在屏幕上展示的动画需要指定View属性例如:

ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f);

Animating with ViewPropertyAnimator

ViewPropertyAnimator 提供简单方法并行执行几个视图属性进行动画。优点精简,可读性高。
下面的代码片段展示了使用多个 ObjectAnimator 对象、 单一的 ObjectAnimator 和 ViewPropertyAnimator,同时进行动画处理的 x 和 y 时的不同视图的属性。
这里写图片描述

Declaring Animations in XML

属性动画系统可以通过XML声明的方式,代替java代码的方式。这样更加的编写,重复利用。
在Android3.1开始属性动画的xml文档需要在res/animator/路径下(代替res/anim)
这里写图片描述

下面是属性动画在XML的例子:
这里写图片描述
为了运行这个动画,你需要在代码中引用,如下操作:
这里写图片描述

属性动画内容介绍到此结束,动手试试吧!这篇文章本人翻译于androidAPI官方文档,可能翻译的不好请见谅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值