Android 插值属性动画Property Animation

一、Android提供了几种动画类型:View Animation (补间View动画)、Drawable Animation(逐帧动画) 、Property Animation(差值属性动画) 。View Animation相当简单,不过只能支持简单的缩放、平移、旋转、透明度基本的动画,且有一定的局限性。比如:你希望View有一个颜色的切换动画;你希望可以使用3D旋转动画;你希望当动画停止时,View的位置就是当前的位置;这些View Animation都无法做到。这就是Property Animation产生的原因。

二、属性动画系统可以定义以下动画特性:

1. 持续时间(Duration):指定动画的持续时间。默认长度是300毫秒。

2. 时间插值(Time interpolation):这个值能够做为计算当前动画运行时间的函数的属性值来指定,它决定动画的变化频率。

3. 重复次数和行为(Repeat count and behavior)

这个属性能够指定在动画结束时是否重新播放动画,以及重复播放的次数。还能够指定动画是否能够反向回播,如果设置了反向回播,那么动画就会先向前再向后,重复播放,直到达到播放次数。

4. 动画集合(Animator sets):你能够把动画组织到一个逻辑集合中,然后或者同时、或者顺序的、或者延迟播放它们。

5. 帧刷新延迟(Frame refresh delay):你能够指定动画帧的刷新频率。默认是每10秒中刷新一次,但是应用程序最终的刷新帧的速度依赖与系统的繁忙程度以及系统能够提供的底层定时器的反应速度


三、使用

public final class ObjectAnimator extends ValueAnimator

public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
1、使用实例:
   ObjectAnimator animator = ObjectAnimator.ofFloat(myTextView, "alpha", 0.0f, 1.0f, 0.0f);
   animator.setDuration(3000);
   animator.start();

同理propertyName可以设为rotation,translationX,translationY,scaleX,scaleY来实现相应功能;

2、xml资源文件形式使用:

    在res/animator文件夹下建立相应xml文件:

<?xml version="1.0"encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:valueFrom="1.0"
    android:valueTo="0.0"
    android:valueType="floatType"
    android:propertyName="alpha"
    android:duration=" 1000"
    android:repeatCount="-1"
    android:repeatMode="reverse">
</objectAnimator>
在代码中使用如下:
   Animator animator = AnimatorInflater.loadAnimator(this, R.animator.myanimator);
   animator.setTarget(myTextView);
   animator.start();
3、监听器AnimatorListener

    animator.addListener(new AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {           
        }
        @Override
        public void onAnimationRepeat(Animator animation) {           
        }
        @Override
        public void onAnimationEnd(Animator animation) {           
        }
        @Override
        public void onAnimationCancel(Animator animation) {           
        }
    });
   如果不想实现这么多方法,仅想实现其中的一个或多个方法,可以使用AnimatorListenerAdapter
    animator.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {           
        }
    });
  看一下AnimatorListenerAdapter的源码:(pause,reusme是AnimatorPauseListener中的方法)
public abstract class AnimatorListenerAdapter implements
        Animator.AnimatorListener, Animator.AnimatorPauseListener {
    @Override
    public void onAnimationCancel(Animator animation) {
    }
    @Override
    public void onAnimationEnd(Animator animation) {
    }
    @Override
    public void onAnimationRepeat(Animator animation) {
    }
    @Override
    public void onAnimationStart(Animator animation) {
    }
    @Override
    public void onAnimationPause(Animator animation) {
    }
    @Override
    public void onAnimationResume(Animator animation) {
    }
}

四、组合动画AnimatorSet

1、实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

  • after(Animator anim)   将现有动画插入到传入的动画之后执行
  • after(long delay)   将现有动画延迟指定毫秒后执行
  • before(Animator anim)   将现有动画插入到传入的动画之前执行
  • with(Animator anim)   将现有动画和传入的动画同时执行

2、示例:    

    ObjectAnimator firstAnimator  = ObjectAnimator.ofFloat(myTextView, "translationX", -500f, 0f);
    ObjectAnimator secondAnimator = ObjectAnimator.ofFloat(myTextView, "rotation", 0f, 360f);
    ObjectAnimator thirdAnimator  = ObjectAnimator.ofFloat(myTextView, "alpha", 1f, 0f, 1f);
    AnimatorSet animSet = new AnimatorSet();
    animSet.play(firstAnimator).with(secondAnimator).after(thirdAnimator);
    animSet.setDuration(5000);
    animSet.start();

3、XML资源文件形式使用得:(类似于上面的使用方法)

    在res/animator文件夹下创建xml文件:

<?xml version="1.0"encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">
 
    <objectAnimator
        android:duration="2000"
        android:propertyName="translationX"
        android:valueFrom="-500"
        android:valueTo="0"
        android:valueType="floatType">
    </objectAnimator>
 
    <set android:ordering="together">
        <objectAnimator
            android:duration="3000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType">
        </objectAnimator>
 
        <set android:ordering="sequentially">
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="1"
                android:valueTo="0"
                android:valueType="floatType">
            </objectAnimator>
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="0"
                android:valueTo="1"
                android:valueType="floatType">
            </objectAnimator>
        </set>
    </set>
    <!-- ordering表示组合的播放顺序:sequentially表示顺序执行,together表示同时执行 -->
 
</set>
   在代码中使用:
  Animator animator = AnimatorInflater.loadAnimator(this, R.animator.myset);
  animator.setTarget(myTextView);
  animator.start();

4、使用propertyValuesHolder来使得一个动画实现多种效果:
// 组合形式使用动画
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("scaleX", 1f, 1.3f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.3f);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(loadingImg, pvhX, pvhY);
animator.setDuration(DURATION_TIME);


你可能感兴趣的:(Android 插值属性动画Property Animation)