ObjectAnimator的propertyName使用

相比ValueAnimator类,ObjectAnimator更加实用,因为它真正可以作用在一个对象上。不过ObjectAnimator是继承自ValueAnimator的,所以主体方法还是ValueAnimator里实现的。
在使用ObjectAnimator的时候,常用的有ofFloat(),ofInt(),ofObject(),ofArgb(),ofPropertyValuesHolder().
这里主要记录一下,ObjectAnimator的propertyName,因为平时使用的时候,只针对以下这些常见一些属性进行动画,而没有自定义属性

  • 常见属性
//1、透明度:alpha  
public void setAlpha(float alpha)  

//2、旋转度数:rotation、rotationX、rotationY  
public void setRotation(float rotation)  
public void setRotationX(float rotationX)  
public void setRotationY(float rotationY)  

//3、平移:translationX、translationY  
public void setTranslationX(float translationX)   
public void setTranslationY(float translationY)  

//缩放:scaleX、scaleY  
public void setScaleX(float scaleX)  
public void setScaleY(float scaleY)  

查看了一下View里面常用的几个setXXX,可以看到在View中已经实现了有关alpha,rotaion,translate,scale相关的set方法。所以我们在构造ObjectAnimator时可以直接使用。
1、要使用ObjectAnimator来构造对画,要操作的控件中,必须存在对应的属性的set方法
2、setter 方法的命名必须以骆驼拼写法命名,即set后每个单词首字母大写,其余字母小写,即类似于setPropertyName所对应的属性为propertyName

  • 原理


    propertyName.png

    可以看到ObjectAnimator的动画流程中,也是首先通过加速器产生当前进度的百分比,然后再经过Evaluator生成对应百分比所对应的数字值。这两步与ValueAnimator是完全一样的,唯一不同的是最后一步,在ValueAnimator中,我们要通过添加监听器来监听当前数字值。而在ObjectAnimator中,则是先根据属性值拼装成对应的set函数的名字,比如这里的scaleY的拼装方法就是将属性的第一个字母强制大写后,与set拼接,所以就是setScaleY。然后通过反射找到对应控件的setScaleY(float scaleY)函数,将当前数字值做为setScaleY(float scale)的参数将其传入,这里在找到控件的set函数以后,是通过反射来调用这个函数的.
    看了一下PropertyValuesHolder的源码,源码就不具体分析了,网上一堆


    这里拼接set方法.png
反射拿到propertyName.png
  • 例子,需要针对圆的半径和透明度进行动画
 //设置水波纹半径
    public void setRippleRadius(float radius) {
        mRadius = radius;
        invalidate();
    }

    //设置水波纹 alpha 范围[0-255]
    public void setRippleAlpha(int alpha) {
        mAlpha = alpha;
        invalidate();
    }
        ObjectAnimator radiusAnimator = ObjectAnimator.ofFloat(this, "RippleRadius", 10, 50);
        radiusAnimator.setRepeatMode(ValueAnimator.RESTART);
        radiusAnimator.setRepeatCount(ValueAnimator.INFINITE);
        ObjectAnimator alphaAnimator = ObjectAnimator.ofInt(this, "RippleAlpha", 100, 0);
        alphaAnimator.setRepeatMode(ValueAnimator.RESTART);
        alphaAnimator.setRepeatCount(ValueAnimator.INFINITE);
        mAnimator = new AnimatorSet();
        mAnimator.playTogether(radiusAnimator, alphaAnimator);
        mAnimator.setDuration(1000);
        mAnimator.setInterpolator(new AccelerateInterpolator());

推荐阅读更多精彩内容

  • 【Android 动画】 动画分类补间动画(Tween动画)帧动画(Frame 动画)属性动画(Property ...
    Rtia阅读 3,117评论 1 36
  • Animation Animation类是所有动画(scale、alpha、translate、rotate)的基...
    四月一号阅读 1,282评论 0 10
  • 学习ObjectAnimator基本使用记录 注:本文并非原创,本文为学习启舰大神博客的笔记~ 之前的笔记中已经介...
    关玮琳linSir阅读 1,962评论 0 2
  • 一、概述 在Android动画中,总共有两种类型的动画View Animation(视图动画)和Property ...
    summer_lz阅读 407评论 1 0
  • 今天是第一天参加晨读,一早起来发现群里有小伙伴@我欢迎我的加入!心❤❤里满满的喜悦!然后就开始一边洗衣服一边聆听家...
    姜笋66阅读 25评论 0 0