web-dev-qa-db-ja.com

UIの更新またはタッチイベントまでアニメーションが開始されない

AlphaAnimationに奇妙な問題があります。 AsyncTaskハンドラーが呼び出されると、繰り返し実行されることになっています。

ただし、ハンドラーがActivityで初めて呼び出されたときは、画面をタッチするか、UIが更新される(電話のメニューボタンを押すなど)かしない限り、アニメーションは開始されません。

奇妙な点は、アニメーションが少なくとも1回実行されると、ハンドラーが再度呼び出された場合に問題なく開始されることです。

コードは次のようになります。

// AsyncTask handler
public void onNetworkEvent()
{
  this.runOnUiThread(new Runnable() {
    @Override
    public void run()
    {
      flashScreen(Animation.INFINITE);
    }
  });
}

// Called method
private void flashScreen(int repeatCount)
{
  final View flashView = this.findViewById(R.id.mainMenuFlashView);

  AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
  alphaAnimation.setRepeatCount(repeatCount);
  alphaAnimation.setRepeatMode(Animation.RESTART);
  alphaAnimation.setDuration(300);
  alphaAnimation.setInterpolator(new DecelerateInterpolator());
  alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation)
    {
      flashView.setVisibility(View.VISIBLE);
    }

    @Override
    public void onAnimationEnd(Animation animation)
    {
      flashView.setVisibility(View.GONE);
    }

    @Override
    public void onAnimationRepeat(Animation animation) { }
  });

  flashView.startAnimation(alphaAnimation);
}

runOnUIThreadは必要ないことに気づきましたが(使用しない場合も同じ結果が発生します)、UIスレッド上にいないのでそれを保持することを好みます。

これを引き起こす可能性のあるものに関するアイデアはありますか?

27
Jukurrpa

もう少し調査すると、私の問題はこの質問と同じであることがわかりました: レイアウトアニメーションが最初の実行で機能しない

flashViewの可視性はデフォルトでGONEに設定されていました(Animationがレンダリングされたことがないため、Viewがすぐに開始されないため)。 flashView.startAnimation()を呼び出す前にINVISIBLEに設定する

46
Jukurrpa

ViewVISIBLEに設定しても機能しない場合、私の場合のように、Animationを開始する前にrequestLayout()を呼び出すのに役立ちました。そのようです:

Animation an = new Animation() {
...   
view.requestLayout();
view.startAnimation(an);

私の場合、私のView0dip高いため、onAnimationStartを呼び出すことができませんでした。これにより、この問題を回避できました。

26
Zebaz

これは私のために働きました:

view.setVisibility(View.VISIBLE);
view.startAnimation(animation);

viewVISIBLEINVISIBLEではなく、どちらもGONE)に設定する必要があったため、ビューのレンダリングでアニメーション化する必要がありました。

2
Mario Velasco

以前の答えが私を助けなかったので、それは誰かを助けるかもしれません。

私のアニメーションはクリックでビューの高さ(0から実際の高さおよびその逆)を変更していました-アニメーションを展開および縮小します。

アニメーションが終了したときにリスナーを追加して可視性をGONEに設定するまで、何も機能しませんでした。

collapseAnim.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            view.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });

エキスパンドするときは、アニメーションの前にVISIBLEに設定するだけです。

 view.setVisibility(View.VISIBLE);
 view.startAnimation(expandAnim);
0
Vadim

それは簡単なことではありません。実際の答えが得られるまで:アニメーションの開始はonNetworkEventによってトリガーされます。コードの残りの部分がわからないので、そこを見て、簡単に識別できる他のイベントでonNetworkEventを変更してみてください。コードの残りの部分に問題がないか、それともトリガーにすぎないかをデバッグするだけです。それに対して責任があります。

0
TheBeps