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スレッド上にいないのでそれを保持することを好みます。
これを引き起こす可能性のあるものに関するアイデアはありますか?
もう少し調査すると、私の問題はこの質問と同じであることがわかりました: レイアウトアニメーションが最初の実行で機能しない
flashView
の可視性はデフォルトでGONE
に設定されていました(Animation
がレンダリングされたことがないため、View
がすぐに開始されないため)。 flashView.startAnimation()
を呼び出す前にINVISIBLE
に設定する
View
をVISIBLE
に設定しても機能しない場合、私の場合のように、Animation
を開始する前にrequestLayout()
を呼び出すのに役立ちました。そのようです:
Animation an = new Animation() {
...
view.requestLayout();
view.startAnimation(an);
私の場合、私のView
は0dip
高いため、onAnimationStart
を呼び出すことができませんでした。これにより、この問題を回避できました。
これは私のために働きました:
view.setVisibility(View.VISIBLE);
view.startAnimation(animation);
view
をVISIBLE
(INVISIBLE
ではなく、どちらもGONE
)に設定する必要があったため、ビューのレンダリングでアニメーション化する必要がありました。
以前の答えが私を助けなかったので、それは誰かを助けるかもしれません。
私のアニメーションはクリックでビューの高さ(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);
それは簡単なことではありません。実際の答えが得られるまで:アニメーションの開始はonNetworkEventによってトリガーされます。コードの残りの部分がわからないので、そこを見て、簡単に識別できる他のイベントでonNetworkEventを変更してみてください。コードの残りの部分に問題がないか、それともトリガーにすぎないかをデバッグするだけです。それに対して責任があります。