一、ViewPropertyAnimator简单介绍
这个可怜的动画,它不像CircularReveal一样,有个时髦的中文名字,甚至从来都没有人叫过它的英文名。——鲁迅
为什么它没有中文名字?因为你翻译过来就是:视图属性动画~这不和老大哥重名了嘛?
所以姑且我们称呼它的英文名:维域 · 怕破题 · 俺尼梅特。或许就是因为名字的缘故,这个小伙伴被人慢慢地遗忘……
我们先不翻它的源码,单从名字上来判断:ViewPropertyAnimator有可能是Animator的后代,说不定有些亲戚朋友。
等我们翻它的源码之后,不禁感到悲痛,ViewPropertyAnimator是个孤儿,而且没有兄弟姐妹……
public class ViewPropertyAnimator {
...
}
再看看其源码,原来是对ValueAnimator的封装……
二、初探
我们来看看生来孤独的ViewPropertyAnimator唯一的构造方法:
ViewPropertyAnimator(View view) {
mView = view;
view.ensureTransformationInfo();
}
oh,它的构造方法没有用publish修饰,看的出来,是个有点自闭的小青年。
待我们再去找找这个构造方法在哪使用到时,却只发现了一处:
//View.java
public ViewPropertyAnimator animate() {
if (mAnimator == null) {
mAnimator = new ViewPropertyAnimator(this);
}
return mAnimator;
}
看来,我们想要和这个自闭的小青年打交道,只能通过View了。
那么我们就可以得出一个结论:只能通过 View.animate() 来进行ViewPropertyAnimator动画:
//本例 Demo 使用的 TextView
textView.animate()
当我们再去尝试在上面这行代码后面加个 “.” ,才发现:ViewPropertyAnimator原来是个闷搔货~它提供了很多的关于View的变换方法。
通过这些方法,我们大概可以了解到ViewPropertyAnimator能够做的事情:
- 位移动画
- 旋转动画(支持Z、X、Y轴)
- 缩放动画
- 透明动画
三、简单使用
这次我们就挑旋转动画吧,代码很简单:
btn_start.setOnClickListener {
textView.animate()
.rotationX(360f) //咸鱼式的 X 轴翻身
.setDuration(2000)
}
其他的动画就不做展示和说明了,我相信聪明的大🔥,能够看到方法就能够会用。
这里要说明一下各个 xxxBy() 方法,以 rotationX() 作为例子,ViewPropertyAnimator还提供了 rotationXBy() 方法。
比如说,我给textView设置一个初始的rotationX = 30,那么textView的初始旋转角度就有了30度。
- 调用 rotationX(),那么textView的转角就会从30度到360度。
- 调用 *rotationXBy(),*那么textView的转角就会从30度到30+360=390度。
相信聪明的大🔥一下子就明白了,这个加By的方法,其实就是其offset值。
这里再介绍两个方法:
- withStartAction(Runnable runnable)
- withEndAction(Runnable runnable)
你可以调用这两个方法,做些事情,这些动作发生在开始动画前和结束动画后。
四、小结
既然ViewPropertyAnimator是对于ValueAnimator的封装,本着存在即合理,它的存在肯定是有一定的道理。
官方文档是这么介绍的:
如果对于View,你仅仅使用一两个ObjectAnimator是不错的,但是如果设置多个属性,或者只希望用简短的语法,那么ViewPropertyAnimator是个很好的选择。
有一个注意点,那就是该动画是以性能优化为首要,所以牺牲了一些东西,该动画是一次性的,只能调用一次!
所以在我们具体的开发过程中,应该适当的选择技术类型。