16 Mar 2017

ViewPropertyAnimator的一个大坑

前言

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);

加在哪里我就不说了.


Tags:
Stats:
0 comments