自定义动画属性

今天项目遇到了动画属性方面的问题,看了一下代码,发现动画的属性怎么不是我们平时用的''alpha"、"translationX"的属性,好吧,原来是可以自己定义动画属性名的。
下面是以我项目中的问题做例子:

  1. 自定义一个view
public class ScaleView extends View {
 
    public ScaleView(Context context) {
        this(context, null);
    }

    public ScaleView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
}

  1. 给自定义的动画属性定义一个属性名,如我们平常使用的"translationX"、"translationY"、"alpha"等,在这里,我以'"myScale"为动画属性的名字,用这个这个属性来同时实现view的"scaleX"、"scaleY"的属性变化。

当然,自己可以组合,实现各种想要的动画,然后只要通过这个属性名,
就可以实现所要的动画,不用一个一个加到动画集合中了。

  1. 在自定义的view中,实现属性的settter和getter方法,这个是很重要的,没有实现的话,在开始动画的时候,就会因为取不到属性值而崩溃。
    异常可能如下:
 E/PropertyValuesHolder: Couldn't find no-arg method for property myScale: java.lang.NoSuchMethodException: getMyScale[]
E/AndroidRuntime: FATAL EXCEPTION: main
                                      java.lang.NullPointerException
                                      at android.animation.PropertyValuesHolder.setupSetterAndGetter(PropertyValuesHolder.java:513)
                                      at android.animation.ObjectAnimator.initAnimation(ObjectAnimator.java:392)
                                      at android.animation.ValueAnimator.setCurrentPlayTime(ValueAnimator.java:544)
                                      at android.animation.ValueAnimator.start(ValueAnimator.java:934)
                                      at android.animation.ValueAnimator.start(ValueAnimator.java:957)
                                      at android.animation.ObjectAnimator.start(ObjectAnimator.java:370)

在这里,我定义的方法为:

private float mScaleFraction;//保存fraction的值,在动画开始后,自动调用这两个方法
public void setMyScale(float fraction) {
    mScaleFraction = fraction;
    setScaleX(1f + fraction * 0.5f);//x、y都是放大0.5倍
    setScaleY(1f + fraction * 0.5f);
}

 public float getMyScale() {
     return mScaleFraction;
 }

注意 : 上面这两个方法是动画执行时自动调用fraction的范围就是我们在定义动画时传入的,如ObjectAnimatior.ofFloat(targetObject, "myScale", 0f, 1f),其中0f、1f就是fraction变化的范围。

4 使用的话,跟我们平常使用动画是一样的。

  ScaleView mScaleView;
  ObjectAnimator animator = ObjectAnimator.ofFloat(mScaleView, "myScale", 0.0f, 1.0f);
                animator.setDuration(3000);
                animator.setRepeatCount(2);
                animator.setRepeatMode(ValueAnimator.REVERSE);
                animator.start();

注意:传入的属性名的命名,以我这里为例:"myScale", 那么在getter和setter中,就要以setMyScale(float)和getMyScale()为方法名了。

你可能感兴趣的:(自定义动画属性)