自定义动画属性

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 2,758评论 0 10
  • Animation Animation类是所有动画(scale、alpha、translate、rotate)的基...
    四月一号阅读 1,936评论 0 10
  • 2017年6月18日 星期日 晴 今天父亲节,首先祝天下父亲节日快乐!幸福安康! 这2天高温,...
    云哲云灿妈妈阅读 156评论 0 0
  • 中国人无酒不成筵席,酒联络人们的感情,表达人们庆贺、喜悦之情。 父亲极爱饮酒,耳濡目染,觉得酒...
    风铃_bb0d阅读 862评论 4 5
  • 集合类主要是负责保存、盛装其他数据和引用类型的对象。根接口是collection和map。主要意义是减少编 ...
    自在19阅读 217评论 0 1