美文网首页
ObjectAnimator的propertyName使用

ObjectAnimator的propertyName使用

作者: 奋斗小青年Jerome | 来源:发表于2018-04-16 17:27 被阅读463次

相比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());

相关文章

网友评论

      本文标题:ObjectAnimator的propertyName使用

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