29

に奇妙な問題があり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 スレッドを使用していないため、そのままにしておくことを好みます。

これを引き起こす原因についてのアイデアはありますか?

4

5 に答える 5

50

もう少し調査したところ、私の問題はこの質問と同じであることがわかりました: Layout animation not working on first run

flashView可視性はGONEデフォルトで に設定されていた (がレンダリングされAnimationていないため、 がすぐに開始されない) ため、呼び出す前にViewに設定する必要があるだけです。INVISIBLEflashView.startAnimation()

于 2013-04-26T14:56:44.810 に答える
30

私の場合のように を に設定しViewVISIBLEもうまくいかない場合は、 をrequestLayout()開始する前に次のAnimationように呼び出すことができました。

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

私の場合、私View0dip高かったためonAnimationStart、呼び出されませんでした。これは、その問題を回避するのに役立ちました。

于 2014-01-10T00:17:38.043 に答える
0

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

于 2013-04-26T14:23:21.127 に答える