Android 无法删除ViewPropertyAnimator';听众

Android 无法删除ViewPropertyAnimator';听众,android,viewpropertyanimator,Android,Viewpropertyanimator,当我在自定义视图中运行此代码时,onAnimationStart和onAnimationEnd会被反复调用。这不是很奇怪吗? 作为一名安卓程序员,我希望他们只分别被调用一次 但是,当ViewPropertyAnimator调用onAnimationEnd时,我试图通过删除侦听器来解决这个问题,但不管文档中写了什么,它都无法工作: public ViewPropertyAnimator setListener (Animator.AnimatorListener listener) Added

当我在自定义视图中运行此代码时,
onAnimationStart
onAnimationEnd
会被反复调用。这不是很奇怪吗? 作为一名安卓程序员,我希望他们只分别被调用一次

但是,当
ViewPropertyAnimator
调用
onAnimationEnd
时,我试图通过删除侦听器来解决这个问题,但不管文档中写了什么,它都无法工作:

public ViewPropertyAnimator setListener (Animator.AnimatorListener listener)

Added in API level 12
Sets a listener for events in the underlying Animators that run the property animations.

Parameters
listener    The listener to be called with AnimatorListener events. A value of null removes any existing listener.
Returns
This object, allowing calls to methods in this class to be chained.

还有其他人遇到过这个奇怪的问题吗?可能是安卓的bug?

我刚刚遇到了这个问题,但没有自定义视图

在我的例子中,我在同一个视图上有两个动画。作秀和隐藏

的确如此

showView(){
  myView.animate().translationY(myView.getHeight()).setListener(new ...{
    ...
    onAnimationEnd(Animation animation){
     hideView();
    }
    ...}).start();
}
hideView(){
  myView.animate().translationY(0).start();
}
当hideView()完成时,它将再次调用自身。这是因为旧的侦听器仍处于设置状态。修复它的关键在于在第二个动画中将侦听器设置为null。e、 g

hideView(){
  myView.animate().translationY(0).setListener(null).start();
}

在哪里调用animator.start()?在我的自定义视图中,顺便说一句,实际上我甚至不需要调用它,动画将在下一个机会(可能是下一帧)开始。我在文档的某个地方读到了它“在我的自定义视图中”是什么意思?什么方法?哦,对不起,当触摸操作是action|UP | | action_CANCELsetListener(null)时,我将其称为onTouch事件,实际上可以从侦听器回调本身中调用它,这使得代码更整洁,因为侦听器会在自己之后进行清理。@Mauker您可以使用myView.animate().setListener(null);最后。。看起来有点奇怪,但看看android源代码,animate()方法返回先前创建的ViewPropertyAnimator,所以您只需返回该值并将侦听器设置为null。
hideView(){
  myView.animate().translationY(0).setListener(null).start();
}