美文网首页
自定义动画属性

自定义动画属性

作者: OhIAm | 来源:发表于2017-04-11 19:01 被阅读0次

    今天项目遇到了动画属性方面的问题,看了一下代码,发现动画的属性怎么不是我们平时用的''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()为方法名了。

    相关文章

      网友评论

          本文标题:自定义动画属性

          本文链接:https://www.haomeiwen.com/subject/pnjyattx.html