Android - Animator类型及使用方式描述

252 阅读6分钟

参考:

ObjectAnimator开发手册

Interpolator 动画插值器

Android - 补间动画

Animator

在Android中,我们知道存在两种动画类型:

  • 视图动画(View Animator)
  • 属性动画(Property Animator)

View Animator & Property Animator 区别

  • 视图动画包括补间动画和帧动画,从API 1就有;
  • 属性动画从API 11才开始引入;
区别View AnimationProperty Animation
引入版本API Level 1API Level 11
所在包android.view.animationandroid.animation
命名***Animation***Animator
作用对象控件控件属性

Property Animation

属性动画系统是一个强大的框架,可制作几乎所有内容的动画。定义动画以随时间更改任何对象属性,而不管他是否绘制在屏幕上。属性动画会在指定的时间长度内更改属性(对象中的字段)的值。制作动画,需要指定指定动画的对象属性,例如对象在屏幕上的位置,制作动画的时间以及要在它们之间进行动画的值;

Animation Property

Property Animation支持的属性值特征:

  • 持续时间:默认时长为300ms;
  • 时间插值:指定如何根据动画的当前经过时间来计算属性的值;
  • 重复次数和行为:指定动画的结束之后是否重复以及重复次数,也可以指定是否需要反向播放动画;
  • 动画集:可以将动画分组为逻辑集,这些逻辑集可以一起播放或按顺序播放,或在指定的延迟后播放;
  • 帧刷新延迟:可以指定刷新动画帧的频率。默认设置为每10毫秒刷新一次,但是应用程序刷新帧的速度最终取决于系统整体的繁忙程度以及系统为底层计时器提供服务的速度;

Property Animator包含两种实现类型:

  • ValueAnimator
  • ObjectAnimator

ValueAnimator

ValueAnimator 构造

ValueAnimator类提供了一个简单的计时引擎,用于运行动画,该动画计算Animation Value并将其设置在目标对象上。

有6种方式构造ValueAnimator:

  • new ValueAnimator():直接用默认构造方法,不过需要继续设置属性动画属性;

  • ValueAnimator.ofInt(int... values):构造并返回一个在int值之间进行动画处理的ValueAnimator;

    public static ValueAnimator ofInt(int... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setIntValues(values);
        return anim;
    }
    
  • ValueAnimator.ofFloat(float... values):构造并返回一个在float值之间进行动画处理的ValueAnimator。float类型的构造基本上和int类型的构造类似;

  • ValueAnimator.ofArgb(int... values):构造并返回一个在颜色(ARGB) 值之间进行动画处理的ValueAnimator;

    public static ValueAnimator ofArgb(int... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setIntValues(values);
        anim.setEvaluator(ArgbEvaluator.getInstance());
        return anim;
    }
    
  • ValueAnimator.ofObject(TypeEvaluator evaluator, Object... values):构造并返回一个在对象值之间进行动画处理的ValueAnimator;

    单个值表示该值是要动画显示的值,但是这在ValueAnimator对象中通常没有用,因为该对象无法确定动画的起始值(与ObjectAnimator不同,后者可以从正在动画的目标对象和属性中获取该值);

    public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values) {
        ValueAnimator anim = new ValueAnimator();
        // 在定制的setXxxValues()方法中,实质上也是调用了Animator中的setValues()方法,
        anim.setObjectValues(values);
        anim.setEvaluator(evaluator);
        return anim;
    }
    
  • ValueAnimator.ofPropertyValuesHolder(PropertyValuesHolder... values):构造并返回一个ValueAnimator,该动画在PropertyValuesHolder对象中指定的值之间进行动画处理;

    public static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setValues(values);
        return anim;
    }
    

我们以int类型的ValueAnimator为例,分析方法参数:

ValueAnimator valueAnimator = ValueAnimator.ofInt(startX, endX);

  • startX:动画的初始值,针对移动动画,startX代表了动画的初始位置;
  • endX:动画的结束值,针对移动动画,endX代表了动画的结束位置;

ValueAnimator 使用

// 构建ValueAnimator实例
ValueAnimator valueAnimator = new ValueAnimator();
// 设置动画的初始值过渡的结束值
valueAnimator.setIntValues(0, 100);
// 动画的持续时长
valueAnimator.setDuration(1500);
// 设置Interpolator, Interpolator被用来修饰动画效果, 定义动画的变化率
valueAnimator.setInterpolator(new OvershootInterpolator(1.0f));
// 设置动画的重复次数
valueAnimator.setRepeatCount(1);
// 设置动画的循环模式
//   ValueAnimator.RESTART:从结束位置反过来进行动画
//   ValueAnimator.INFINITE:从开始位置重新进行动画
valueAnimator.setRepeatMode(ValueAnimator.RESTART);
// 设置Animation监听器,通过回调的方式获取实时计算出来的变化值
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        int value = (Integer) animation.getAnimatedValue();
    }
});
valueAnimator.start();
AnimatorUpdateListener

ValueAnimator类中增加了AnimatorUpdateListener监听器接口,在onAnimationUpdate(ValueAnimator animation)回调方法中获取实时计算变化的值,设置给View;

public static interface AnimatorUpdateListener {
    void onAnimationUpdate(ValueAnimator animation);
}

ObjectAnimator

ObjectAnimator是ValueAnimator的子类,提供目标对象的动画设置的支持;此类构造方法使用参数来定义将被动画化的目标对象以及被动画化的属性的名称;在内部确定适当的set/get方法,动画将在必要时调用这些方法来设置属性动画;

使用ObjectAnimator的时候,操作的属性必须有get和set方法,否则无法生效,所以对于没有set和get方法的属性,开发者可以自定义包装一个set和get属性;

ObjectAnimator支持使用PropertyValuesHolder和Keyframe在资源文件中创建更复杂的动画。使用PropertyValuesHolders可使动画师并行制作多个属性的动画;

ObjectAnimator继承自ValueAnimator,因此ValueAnimator中的方法都可以使用,有一些高级的方法涉及到PropertyPropertyValuesHolderTypeEvaluator

  • Property:动画属性,该属性的set(Object, Object)get(Object)方法可以根据对象的专用字段,或通过settergetter方法或通过适当的某种其他机制来实现;
  • PropertyValuesHolder:该类包含有关属性的信息以及该属性在动画过程中应该采用的值, PropertyValuesHolder对象可用于通过ValueAnimator或ObjectAnimator创建动画,并行操作多个不同的属性;
  • TypeEvaluator:用于setEvaluator(TypeEvaluator)功能的接口。评估者允许开发者在任意属性类型上创建动画,允许他们为动画系统不能自动理解和使用的类型提供自定义评估器;

ObjectAnimator 构造

  • ObjectAnimator ofArgb (Object target, String propertyName, int... values)
  • ObjectAnimator ofArgb (T target, Property<T, Integer> property, int... values)
  • ObjectAnimator ofFloat (Object target,String xPropertyName, String yPropertyName, Path path)
  • ObjectAnimator ofFloat (T target, Property<T, Float> property, float... values)
  • ObjectAnimator ofFloat (T target, Property<T, Float> xProperty, Property<T, Float> yProperty, Path path)
  • ObjectAnimator ofFloat (Object target, String propertyName, float... values)
  • ObjectAnimator ofInt (T target, Property<T, Integer> xProperty, Property<T, Integer> yProperty, Path path)
  • ObjectAnimator ofInt (T target, Property<T, Integer> property,int... values)
  • ObjectAnimator ofInt (Object target,String propertyName, int... values)
  • ObjectAnimator ofInt (Object target, String xPropertyName,String yPropertyName, Path path)
  • ObjectAnimator ofMultiFloat (Object target, String propertyName, float values)
  • ObjectAnimator ofMultiFloat (Object target, String propertyName, Path path)
  • ObjectAnimator ofMultiFloat (Object target, String propertyName, TypeConverter<T, float[]> converter, TypeEvaluator evaluator, T... values)
  • ObjectAnimator ofMultiInt (Object target, String propertyName, int values)
  • ObjectAnimator ofMultiInt (Object target, String propertyName, TypeConverter<T, int[]> converter, TypeEvaluator evaluator, T... values)
  • ObjectAnimator ofMultiInt (Object target, String propertyName, Path path)
  • ObjectAnimator ofObject (T target, Property<T, P> property, TypeConverter<V, P> converter, TypeEvaluator evaluator, V... values)
  • ObjectAnimator ofObject (T target, Property<T, V> property, TypeEvaluator evaluator, V... values)
  • ObjectAnimator ofObject (Object target, String propertyName, TypeConverter<PointF, ?> converter, Path path)
  • ObjectAnimator ofObject (Object target, String propertyName, TypeEvaluator evaluator, Object... values)
  • ObjectAnimator ofObject (T target, Property<T, V> property, TypeConverter<PointF, V> converter, Path path)
  • ObjectAnimator ofPropertyValuesHolder (Object target, PropertyValuesHolder... values)
ObjectAnimator set
  • setAutoCancel(boolean cancel)
  • ObjectAnimator setDuration(long duration)
  • setFloatValues(float... values)
  • setIntValues(int... values)
  • setObjectValues(Object... values)
  • setProperty(Property property)
  • setPropertyName(String propertyName)
  • setTarget(Object target)
  • setupEndValues()
  • setupStartValues()
ObjectAnimator get
  • getNameForTrace():返回此动画制作器的名称以进行调试,框架调用,开发无法调用因为默认包访问权限;
  • getPropertyName():获取将设置动画的属性的名称,即构造传入的propertyName参数;
  • Object getTarget():动画对象;

ObjectAnimator 使用

// mImageView:目标对象,后续会操作该目标的属性动画
// alpha:设置将要动画的属性的名称,String类型的参数
// 0.3f:动画初始值
// 1.0f:动画结束值
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mImageView, "alpha", 0.3f, 1.0f);
objectAnimator.setEvaluator(new FloatEvaluator());
objectAnimator.setDuration(1500);
objectAnimator.start();