Android动画(六)ObjectAnimator

本文深入解析ObjectAnimator的使用方法,包括改变透明度、旋转、平移、缩放等属性动画的实现,以及动画原理和自定义属性设置。通过具体示例展示如何操作控件属性,实现丰富的视觉效果。

一、概述

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
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值