相比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
- 例子,需要针对圆的半径和透明度进行动画
//设置水波纹半径
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());
网友评论