当我在自定义视图中运行此代码时,会不断重复调用onAnimationStart
和onAnimationEnd
。这不是很奇怪吗?
作为Android程序员,我预计它们只会被调用一次。
final ViewPropertyAnimator animator = animate().setDuration(1000).alpha(0.0f); animator.setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { Utils.log("----------------start"); } @Override public void onAnimationEnd(Animator animation) { Utils.log("--------- end"); } }).start();
但是我试图通过在onAnimationEnd
的{{3}}调用ViewPropertyAnimator
时删除侦听器来解决问题,但是尽管在文档中写了什么,它仍然无效:
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.
还有其他人遇到过这个奇怪的问题吗?也许这是Android的错误?
答案 0 :(得分:20)
我刚遇到此问题但没有自定义视图。
就我而言,我在同一视图中有两个动画。表演和隐藏。
所以它是
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();
}