ViewPropertyAnimator?我第一次听到这个类的时候,第一反应,Animator?为什么我之前学Animator的时候没见过你啊,而且去翻一下文档,啥??你还不是Animator的派生类?什么神奇玩意?于是我就开始百度看了下这东西.
其实Animator就是一个方便做view的动画的工具类(请允许我这么说),内部实现是里面有个ObjectAnimator,怎么说呢,有点像代理?反正就是简单用了组合,然后包装下.就是帮你包装了下view的一些基本的动画
什么?你说不是有animation(补间动画,讲道理其实我经常弄混)了吗,不是分别有
| 类 | 说明 |
|---|---|
| AlphaAnimation | 渐变透明度动画效果 |
| ScaleAnimation | 渐变尺寸伸缩动画效果 |
| TranslateAnimation | 画面转换位置移动动画效果 |
| RotateAnimation | 画面转移旋转动画效果 |
嗯,这个是没错,然而这个说到底也只是补间动画(不懂的自己去补,这种动画并没有实际改变view).
于是就有个这个ViewPropertyAnimator,ViewPropertyAnimator是提供了属性动画中对view的支持,能更快的做些view的动画.
百度好多,自己去看吧,这个不是我要说的重点.
这个坑其实很容易看出来,但确实挺坑的,如果你真的按照我前面说的去百度看了下这个的一些教程,特别是看了内部实现的话,那你就应该知道内部有个ObjectAnimator,很多函数都只是包装了下,实质上都交给了ObjectAnimator去做(然而我前面前言好像已经说了).
下面直接上实例:
实现功能:点击背景的时候先消失,然后在消失的时候做个文字上的更新,然后再显示出来.(对,就是这么简单).
bg.animate().setDuration(1000).alpha(0).setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
showNext();
bg.animate().setDuration(1000).alpha(1).start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}).start();
代码我就不解释了吧…
运行结果并不如意,你会发现,动画确实成功了,但你的showNext(这个函数负责更新文字内容),会无限的调用.
究其原因其实很简单,首先你注册了监听器对吧,你其实注册到的是ObjectAnimator的监听,然而你在第一个动画结束后,又执行了下一个动画(这个动画一样被你前面的listener监听),所以就会出现无限回调的情况.
解决办法:
bg.animate().setListener(null);
加在哪里我就不说了.