一、概述
ObjectAnimator是派生自ValueAnimator的,所以ValueAnimator中所能使用的方法,在ObjectAnimator中都可以正常使用。
但ObjectAnimator也重写了几个方法,比如ofInt(),ofFloat()等。
二.ObjectAnimator的初步使用
我们先看看利用ObjectAnimator重写的ofFloat方法如何实现一个动画:(改变透明度)
ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"alpha",1,0,1);
animator.setDuration(2000);
animator.start();
效果图如下:

public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
第一个参数用于指定这个动画要操作的是哪个控件
第二个参数用于指定这个动画要操作这个控件的哪个属性
第三个参数是可变长参数,这个就跟ValueAnimator中的可变长参数的意义一样了,就是指这个属性值是从哪变到哪。
三、setter函数
(1) setRotationX、setRotationY与setRotation
setRotationX(float rotationX):表示围绕X轴旋转,rotationX表示旋转度数
setRotationY(rotationY):表示围绕Y轴旋转,rotationY表示旋转度数
setRotation(float rotation):表示围绕Z旋转,rotation表示旋转度数
先来看看setRotationX的效果:
ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"rotationX",0,270,0);
animator.setDuration(2000);
animator.start();
效果图如下:

从效果图中明显看出,textview的旋转方法是围绕X轴旋转的,我们设定为从0度旋转到270度再返回0度。
然后再来看看setRotationY的使用方法与效果:
ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"rotationY",0,180,0);
animator.setDuration(2000);
animator.start();
效果图如下:

从效果图中明显可以看出围绕Y轴旋转的。
我们再来看看setRotation的用法与效果:
ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"rotation",0,270,0);
animator.setDuration(2000);
animator.start();

我们上面说了,setRotation是围绕Z轴旋转的,可能有些同学不理解什么是Z轴,我们来看一张图:

从这张图中,绿色框部分表示手机屏幕,很明显可以看出Z轴就是从屏幕左上角原点向外伸出的一条轴。这样,我们也就可以理解围绕Z轴旋转,为什么是这样子转了。
(2)setTranslationX与setTranslationY
setTranslationX(float translationX) :表示在X轴上的平移距离,以当前控件为原点,向右为正方向,参数translationX表示移动的距离。
setTranslationY(float translationY) :表示在Y轴上的平移距离,以当前控件为原点,向下为正方向,参数translationY表示移动的距离。
我们先看看setTranslationX的用法:
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "translationX", 0, 200, -200,0);
animator.setDuration(2000);
animator.start();
效果图如下:

所以,我们上面在构造动画时,指定的移动距离是(0, 200, -200,0),所以控件会从自身所有位置向右移动200像素,然后再移动到距离原点-200的位置,最后回到原点;
然后我们来看看setTranslateY的用法:
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "translationY", 0, 200, -100,0);
animator.setDuration(2000);
animator.start();
效果图如下:
同样,移动位置的坐标也都是以当前控件所在位置为中心点的。所以对应的移动位置从原点移动向下移动200像素,然后再移动到向下到距原点200像素的位置,最后再回到(0,0)从效果图中很明显可以看出来。
从上面可以看出:每次移动距离的计算都是以原点为中心的;比如初始动画为ObjectAnimator.ofFloat(tv, “translationY”, 0, 200, -100,0)表示首先从0移动到正方向200的位置,然后再移动到负方向100的位置,最后移动到原点。
(3)setScaleX与setScaleY
setScaleX(float scaleX):在X轴上缩放,scaleX表示缩放倍数
setScaleY(float scaleY):在Y轴上缩放,scaleY表示缩放倍数
我们来看看setScaleX的用法:
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "scaleX", 0, 3, 1);
animator.setDuration(2000);
animator.start();
效果图如下:

在效果图中,从0倍放大到3倍,然后再还原到1倍的原始状态。
然后再来看看setScaleY的用法
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "scaleY", 0, 3, 1);
animator.setDuration(2000);
animator.start();
效果图如下:

四、ObjectAnimator动画原理
五、自定义ObjectAnimator属性
即重写set方法
六、注意——何时需要实现对应属性的get函数
ObjectAnimator animator = ObjectAnimator.ofInt(mPointView, "pointRadius",100);
当且仅当动画的只有一个过渡值时,系统才会调用对应属性的get函数来得到动画的初始值。
原文:https://blog.youkuaiyun.com/harvic880925/article/details/50598322
版权声明:本文为博主原创文章,转载请附上博文链接!
本文深入解析ObjectAnimator的使用方法,包括改变透明度、旋转、平移、缩放等属性动画的实现,以及动画原理和自定义属性设置。通过具体示例展示如何操作控件属性,实现丰富的视觉效果。
6万+

被折叠的 条评论
为什么被折叠?



