8

カスタムビュー内でこのコードを実行するonAnimationStartonAnimationEnd、繰り返し呼び出され続けます。変じゃない?Android プログラマーとして、私はそれらがそれぞれ 1 回だけ呼び出されることを期待していました。

    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しかし、私はによって呼び出されたときにリスナーを削除することで問題を解決しようとしましたViewPropertyAnimatorsetListener(null)、ドキュメントに書かれているにもかかわらず、うまくいきませんでした:

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のバグですか?

4

1 に答える 1

27

この問題に遭遇しましたが、カスタム ビューはありません。

私の場合、同じビューに 2 つのアニメーションがありました。見せたり隠したり。

そうでした

showView(){
  myView.animate().translationY(myView.getHeight()).setListener(new ...{
    ...
    onAnimationEnd(Animation animation){
     hideView();
    }
    ...}).start();
}
hideView(){
  myView.animate().translationY(0).start();
}

hideView() が終了すると、再び自分自身を呼び出します。これは、古いリスナーがまだ設定されているためです。それを修正するための鍵は、2 番目のアニメーションでリスナーを null に設定することになりました。例えば

hideView(){
  myView.animate().translationY(0).setListener(null).start();
}
于 2015-04-23T23:43:26.763 に答える