zoukankan      html  css  js  c++  java
  • android动画具体解释四 创建动画

    使用ValueAnimator进行动画


        通过指定一些int, float或color等类型的值的集合。ValueAnimator 使你能够对这些类型的值进行动画。你需通过调用ValueAnimator 的某个工厂方法来获得一个ValueAnimator 对象。比方:ofInt()ofFloat(), 或 ofObject()。比如:

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

        此段代码中,当start()方法运行时,開始计算在1000 ms中处于0和1之间的动画的值。

        你也能够按下面方式指定一个自己定义类型来进行动画:

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

        在此段代码中, ValueAnimator 在 start() 方法运行时,開始计算在1000 ms 中处于startPropertyValue 和endPropertyValue 之间的动画的值,使用MyTypeEvaluator 提供的计算逻辑。

        然而,在上面代码片段中,实际上对对象没有不论什么影响。由于ValueAnimator 不直接操作对象或属性。你应该自己跟据所计算出的值自己改动对象。你能够定义一个监听器来处理动画过程中ValueAnimator的重要事件们,比方更新帧。

    当实现了监听器们。你就能够在帧刷新时通过调用getAnimatedValue()获得动画的值。


    使用ObjectAnimator进行动画

        ObjectAnimator 是ValueAnimator 的一个子类而且合并了时间引擎和ValueAnimator的计算能力来动画一个对象的属性,这个属性通过名字指定。

    这使得动画一个对象更加easy,由于你不再须要实现ValueAnimator.AnimatorUpdateListener,由于要动画的属性是自己主动更新的。

    实例化ObjectAnimator 和实例化ValueAnimator非常类似,可是你还须要指定对象和对象的属性的名字:

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

    要使ObjectAnimator 能正确的更新属性。你必须按下面去做:

    · 你要动画的对象的属性必须具有一个setter函数,像这个样子:set<propertyName>()。 由于 ObjectAnimator 在动画期间会自己主动更新属性,必须能通过此setter方法操作目标属性。比如,假设属性的名字是foo,你必须具有一个setFoo()方法。假设此方法不存在,你有三个选择: 

    · 假设能够,你自己加入setter方法(废话)。 

    · 用另外一个类封装此对象的类,于是你就有了改写权力了。在封装类中加入操作原始类的属性的setter。

    · 改用 ValueAnimator。 

    · 假设在ObjectAnimator 的某个工厂方法中,你仅仅指定了一个values...參数。这个參数就被视为动画的结束值。

    因此,你动画的对象属性必须具有一个getter方法,用于获取開始值。getter方法必须具有get<propertyName>()样的格式。

    比如。假设属性名是foo,你须要带有一个getFoo()方法。

     

    · 你要动画的属性的getter (假设须要)和setter方法处理的数据类型必须跟你为ObjectAnimator指定的開始和结束值的类型同样。比如,假设你创建例如以下的ObjectAnimator,你必须具有targetObject.setPropName(float)方法和targetObject.getPropName(float)方法: 

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

    · 跟据动画的对象和属性的不同。你可能须要调用View的invalidate()方法来强制屏幕使用新的动画数据重绘自己。你应在onAnimationUpdate() 回调中这样做。比如。动画一个Drawable对象的color属性导致仅在对象重绘自己时才更新屏幕。View的全部的属性setter,比方setAlpha()setTranslationX(),都会使View无效,所以你不须要在调用这些方法时使View无效 。

     


    使用AnimatorSet组合多个动画 

        非常多情况下,你可能想播放一个动画,它的播放时机依赖于其他动画的開始时间或结束时间。Android系统同意你绑定多个动画到一个AnimatorSet中,于是你能够指定是否同一时候播放。或分别播放。或某个延迟后再播放。你还能够相互嵌套各AnimatorSet对象。

        下面的演示样例代码是从样例Bouncing Balls 中拿来的 (小改了一下下)。它以这种方式播放下列动画对象:

    1. 播放 bounceAnim. 

    2. 同一时候播放 squashAnim1, squashAnim2, stretchAnim1, 和 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();

    上一篇:android动画具体解释三 动画API概述

    下一篇:android动画具体解释五 layout,插值与评估器

  • 相关阅读:
    example_php文件上传处理
    andorid SQLite数据库创建文件
    andorid 手机外部储存
    手机界面
    andorid 数据储存、SharedPreferences存储和手机内部储存
    andorid 数据储存
    andorid 多线程handler用法
    andorid 配置器组件和提示消息
    andorid 网格视图GridView
    andorid 列表视图之SimpleAdapter
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7102249.html
Copyright © 2011-2022 走看看