美文网首页
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