Property Animation Part II(属性动画 第二部分)

如何使用ValueAnimator

ValueAnimator类通过指定一组整数,浮点数,或色彩值,以及动画的持续时间来定义。获得一个ValueAnimator对象的实例需要调用它的一个工厂方法:ofint(),offloat() ,或者ofobject(),如下所示:

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

在这段代码中,当start()方法开始运行时,ValueAnimator开始计算在0f和1f之间动画的值,动画的持续时间为1000毫秒。

你也可以指定一个自定义类型的动画如下所示:

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

在这段代码中,当start()方法开始运行时,ValueAnimator开始根据MyTypeEvaluator计算在startpropertyvalue和endpropertyvalue的值,动画的持续时间为1000毫秒。

上面的代码片段,对于某个对象来说,并没有实际的效果,因为ValueAnimator类并不直接对象或属性产生影响。你所需要做的是根据计算得到的值来改变对象的某些属性。你可以通过监听ValueAnimator在动画生命周期中的接口来处理逻辑,比如帧更新。在实现接口时,你可以通过调用getAnimatedValue()来得到特定帧的计算值。

如何使用ObjectAnimator

ObjectAnimator是ValueAnimator的子类,该类会根据计算所得到的数值来直接对预先指定的对象的属性进行更改,由于ObjectAnimator已经自动实现了ValueAnimator.AnimatorUpdateListener,不再需要你来实现 ,这使得对一个对象添加动画变得简单了许多。

实例化一个ObjectAnimator类同上面很相似,但是你需要指定对象和该对象的属性的名称(一个字符串),该属性的值会在动画过程中发生变化,简单的示例如下:

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

为了使得ObjectAnimator可以正确的更新属性,你必须做到以下几点

  • 随着动画发生变化的对象属性必须有一个setter方法(骆驼命名规则)。因为ObjectAnimator动画自动更新属性时,它必须能够通过setter方法访问该属性。例如,如果属性名为foo,你需要有一个setfoo()方法。如果这个setter方法不存在,你有三个选择:

    • 在对应的类中添加setter方法
    • 使用一个封装类,封装类中定义一个setter方法,该方法可以将值传递给你想要改变的那个属性
    • 使用ValueAnimator类来实现
  • 如果在初始化时,你只指定了一个值,那么该值会被认为是动画的结束值。因此,在你的动画对象属性中必须有一个getter函数用于获取动画的起始值。例如,如果属性名为foo,你需要有一个getfoo()方法。
  • 在ObjectAnimator中,属性的getter方法(如果有必要)和setter方法同你指定的的开始和结束值的数据类型必须相同。在下面的示例中,你的targetObject就必须有targetObject.setPropName(float) 和 targetObject.getPropName(float) 方法
ObjectAnimator.ofFloat(targetObject, "propName", 1f);
  • 当你改变某些对象的某些属性时,你可能需要调用View的invalidate()方法通知屏幕使用更新的动画值来重绘。这种代码应该在onAnimationUpdate()的回调函数中调用。比如改变color属性后,只有调用屏幕重绘方法才会实现动画效果。所有的View类中已存在的setter方法,如setalpha()和settranslationx()会在方法内部刷新View,所以当你试图改变这些属性时,你并不需要重新调用invalidate()方法

如何使用AnimatorSet管理多个动画

在许多情况下,你想在另一个动画开始或者结束时执行一个动画,Android系统支持将多个动画同时放入一个AnimatorSet中,使得你可以指定这些动画是同时执行、按顺序执行或者一定延迟后执行。也可以在AnimatorSet中放入AnimatorSet。

下面的代码示例来自于 Bouncing Balls 示例中(已被改的简单了一些),AnimatorSet中包涵了以下的动画:

  1. 执行bounceAnim
  2. 同时执行squashAnim1, squashAnim2, stretchAnim1, and stretchAnim2
  3. 执行bounceBackAnim
  4. 执行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();

如何实现动画事件监听

在动画执行的过程中,你可以监听一个动画的持续时间与下面的事件

  • Animator.AnimatorListener

    • onAnimationStart() - 当动画开始执行时被调用
    • onAnimationEnd() - 当动画结束时被调用
    • onAnimationRepeat() - 当动画重复时被调用
    • onAnimationCancel() - 当动画被取消时被调用,无论动画如何结束的,同时也会调用onAnimationEnd()方法
  • ValueAnimator.AnimatorUpdateListener
    • onAnimationUpdate() - 动画的每一帧都会被调用. 监听这个接口,并使用计算得到的数值(即getAnimatedValue()方法)来修改你希望在当前动画中发生改变的对象的属性。
    • 同ObjectAnimator一样,当你改变某些对象的某些属性时,你可能需要调用View的invalidate()方法通知屏幕使用更新的动画值来重绘。这种代码应该在onAnimationUpdate()的回调函数中调用。改变color属性后,只有调用屏幕重绘方法才会实现动画效果。所有的View类中已存在的setter方法,如setalpha()和settranslationx()会在方法内部刷新View,所以当你试图改变这些属性时,你并不需要重新调用invalidate()方法

如果你不想实现所有的animator.animatorlistener接口的方法。那么你可以选择重写AnimatorListenerAdapter类提供的空的实现方法。

下面是一个 Bouncing Balls 项目的示例,为了调用onAnimationEnd() 回调,创建了一个新的AnimatorListenerAdapter,代码如下

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());
}

如何实现ViewGroups的动画变化

属性动画对ViewGroup的内部成员改变的动画支持跟对View的动画支持一样出色

当一个ViewGroup内部的layout发生改变时,你可以使用LayoutTransition类对其添加动画支持。当你对ViewGroup内部的View调用setVisibility()方法时,View本身可以产生对应的消失或者显示的动画效果。当你添加或者移除View时,也有有对应的位移动画产生。你可以通过调用LayoutTransition的setanimator()方法对某个对象指定下面的某个动画常量:

  • APPEARING - 在容器中的成员出现时的动画。
  • CHANGE_APPEARING - 出现在容器的由于一个成员添加而引起的变化时的动画。
  • DISAPPEARING - 在容器中的成员消失时的动画.
  • CHANGE_DISAPPEARING - 出现在容器的由于一个成员消失而引起的变化时的动画。

你可以定义这四种类型的常量对应的动画效果,或者直接使用系统默认的效果

下面的LayoutAnimations示例展示了如何对一个布局文件设置一个系统默认的动画效果,使用起来十分的简单只需要设置android:animateLayoutchanges属性为true即可,示例如下

<LinearLayout
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:id="@+id/verticalContainer"
    android:animateLayoutChanges="true" />

设置这个属性为true,当有Views添加或被移除时,其内部的所有控件都会有动画效果的展示。

时间: 2024-10-05 01:45:30

Property Animation Part II(属性动画 第二部分)的相关文章

Property Animation Part I(属性动画 第一部分)

原文章地址在此 概述 属性动画系统是一个强大的动画框架系统,几乎可以利用它来使任何对象动起来.你可以定义一个动画在一段时间内来指定任何对象的属性变化,无论该对象是否在当前屏幕中出现.你可以指定某个对象的某个属性在一段时间内发生变化.为了使其动起来,比如改变对象在屏幕上的位置,那么就需要指定指定这次动画的持续时间以及具体的改变距离. 属性动画系统可让您定义一个动画过程中的以下几点 持续时间:你可以指定动画的持续时间.默认长度为300毫秒. 时间插值:您可以指定该属性的值来修改动画的时间轨迹(此处翻

Property Animation Part III(属性动画 第三部分)

如何使用TypeEvaluator 如果你想实现一个安卓系统中没有的动画类型,你可以通过实现TypeEvaluator接口创建自己的计算实现.在Android系统已实现的类型有int(IntEvaluator),float(FloatEvaluator),或颜色(ArgbEvaluator). TypeEvaluator接口中只有一个evaluate()方法需要实现.这个方法会在动画的当前点返回对应的属性值. 下面是FloatEvaluator类的实现代码 public class FloatE

Android动画效果之初识Property Animation(属性动画)(三)

前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Android动画效果之Frame Animation(逐帧动画)(二),其实总结前两个的根本目的就是为了学习今天的主角Property Animation(属性动画).其实在Android最早期只提供了前两种动画方式,在Android 3.0才引入了属性动画,谷歌为何要引入属性动画呢?今天我们来总结学习一

Android Property Animation动画

3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三种动画模式在SDK中被称为property animation,view animation,drawable animation. 可通过NineOldAndroids项目在3.0之前的系统中使用Property Animation 1. View Animation(Tween Animatio

Android动画之三:Property Animation(上)

来完成这个Android动画系列,之前写了View Animation和Drawable Animation,接下来讲解三种动画中的最后一种,Property Animation,这也是Android动画中最强大的一部分,同时也是相对最复杂的一部分. Property Animation与Value Animation的区别 Property Animation翻译为属性动画,从Android3.0开始引入,相比与View Animation,官方更推荐开发者使用Property Animati

Android动画效果之Frame Animation(逐帧动画)

前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame Animation(逐帧动画). 其他几种动画效果: Android动画效果之Tween Animation(补间动画) Android动画效果之Frame Animation(逐帧动画) Android动画效果之初识Property Animation(属性动画) Android动画效果之Prop

Android进阶——属性动画Property Animation详解(一)

引言 前一篇文章Android入门--补间动画和帧动画应用小结总结了补间动画和帧动画及一些相关类的应用,基本可以掌握简单的缩放.旋转.透明度变化.平移的动画效果,但是需要实现更复杂的动画效果时,比如说希望View的切换动画.Layout的切换动画.3D旋转动画等等,这些View Animation都无法做到.此时Property Animation应运而生,这篇主要总结下属性动画的相关知识点. 一.Property Animation属性动画概述 属性动画,在我最先接触到Android 1.5时

属性动画总结(Property Animation)

一.概述 属性动画可以作用在View的属性上,对属性进行修改,而且不要求对应的属性一定是有显示效果的. 二.属性动画的实现方式 1.基础的类Animator Animator是一个抽象类,是属性动画的基础类.不直接使用该类. 2.ObjectAnimator,继承自ValueAnimator 使用起来比较方便的是ObjectAnimator,可以使用ObjectAnimator直接指定需要修改的view,要修改的属性,值的变化范围. ObjectAnimator.ofFloat(view, "r

Android动画-Property Animation(一)

本章内容 在之前 <Android动画-概述>中,我大概说了下Android Property Animation的由来,这里就不做多介绍了,Property Animation 肯定不是一章就能讲的完的,接下来的几章都是建立在代码.效果图的基础上,介绍Property Animation的用法. 本章主要讲的是 ObjectAnimator ,包括代码生成动画,XML加载动画. 简述:在给出一大堆代码之前,先通过效果图来看看一些有趣的动画,通过一个简单有趣的动画逐步展开: 这绝对是一个非常有