web-dev-qa-db-ja.com

android animate()withEndAction()vs setListener()onAnimationEnd()

多くの場合、ViewPropertyAnimatorを使用し、次のようなwithEndAction()関数を使用して終了アクションを設定します。

view.animate().translationY(0).withEndAction(new Runnable() {
    @Override
    public void run() {
        // do something
    }
}).start();

ただし、次のような特別なリスナーを設定する終了アクションを設定することもできます。

view.animate().translationY(0).setListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        // do something
    }
});

では、これら2つのアプローチの違いと、それぞれをいつ使用する必要があるのでしょうか。

22

大きな違いはありません。 ソースコード を見てください。

どちらもonAnimationEndで実行されます。

ただし、ランナブルは開始後に削除されます。したがって、Runnableは1回だけ実行され、リスナーは複数回呼び出される可能性があります。

@Override
public void onAnimationEnd(Animator animation) {
    mView.setHasTransientState(false);
    if (mListener != null) {
        mListener.onAnimationEnd(animation);  // this is your listener
    }
    if (mAnimatorOnEndMap != null) {
        Runnable r = mAnimatorOnEndMap.get(animation); // this is your runnable
        if (r != null) {
            r.run();
        }
            mAnimatorOnEndMap.remove(animation);
    }
    if (mAnimatorCleanupMap != null) {
        Runnable r = mAnimatorCleanupMap.get(animation);  
        if (r != null) {
            r.run();
        }
        mAnimatorCleanupMap.remove(animation);
    }
    mAnimatorMap.remove(animation);
}
19
daemmie