Animation メモ

FrameLayout に addView(View) をするタイミングで TranslateAnimatoin でスライドインさせようとした場合に、以下のケースでチラツキが発生したので、その解決法のメモ。

FrameLayout に元からある View を removeView(View) でアニメーションを伴わせ削除しつつ、addView(View) でアニメーションしつつ追加する場合はチラツキは発生しない。

しかし、FrameLayout に View を残したまま新しい View をアニメーションを伴わせつつ追加すると、一瞬アニメーション最終状態で表示され、アニメーション開始されてしまう。いわゆるチラツキ。

これを回避するために、以下の様なコードを書く。

        child.setVisibility(View.GONE);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                child.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationEnd(Animation animation) {
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });
        child.startAnimation(animation);
        parent.addView(child);

こんな感じ。こちらで見つけた。

android - How to avoid blink of View when using animation? - Stack Overflow

要するに、ちらつく最初は GONE で非表示にさせておき、アニメーションが開始したら VISIBLE に戻す、というもの。

根本的な解決にはなっておらず、かつ実際のアニメーション期間が少し短くなるが、ちらつくよりは良いかと思う。