私は円形のカウントダウンタイマーをアニメーション化する必要があり、AnimationDrawableを使用してImageViewの背景をアニメーション化することでそれを行っています(各イメージには、円の対応するスライスが削除されています)。問題は、ユーザーがこのアニメーションを一時停止できることです。そのため、アニメーションをリロードする必要がありますが、問題が発生します。アニメーションをnullに設定し、ImageViewの背景をnullに設定し、アニメーションの可視性を設定しようとしましたが、フレームの数が変わらないため、実際には何も役に立ちませんでした。すべてのフレームを削除して新しいフレームを追加するための回避策を見つけるか、アニメーション全体をデフォルトの状態にリセットする必要があります。
ステップ1-アニメーションの初期化(開始フレームインデックスは0)
timerView.setBackgroundResource(R.drawable.timer_switch);
timerAnimation = (AnimationDrawable)timerView.getBackground();
System.out.println("Number of frames: " + timerAnimation.getNumberOfFrames());
for (int frameIndex = startingFrameIndex; frameIndex < 60; frameIndex++) {
if (frameIndex < 10) {
uri = "drawable/timer_0000" + frameIndex;
} else {
uri = "drawable/timer_000" + frameIndex;
}
imageResourceId = getResources().getIdentifier(uri, null, getPackageName());
timerAnimation.addFrame(getResources().getDrawable(imageResourceId), timerImageFrameDuration);
}
ステップ2-これは、私が何をすべきかわからないトリッキーな部分です。私が試したこと:
timerAnimation.stop();
timerAnimation.setCallback(null);
timerAnimation.setVisibility(true, false);
timerAnimation = null;
ステップ3-ステップ2を呼び出した後、ステップ1を再度呼び出しますが、Sys.outは現在のフレーム数として60を表示しています。 (ここでの開始インデックスは、一時停止ボタンがタップされたときの最後の非表示フレームに設定されます。)
どんなアイデアでも大歓迎です。
ありがとう
現在のフレームでアニメーションを停止すると同じ問題が発生しました。私はそれがiOSのように振る舞うことを望んだ、そこで停止は最初のフレームに戻るであろう。この解決策は私にとってはうまくいきます:
((AnimationDrawable)(someButton.getBackground())).stop();
someButton.setBackgroundDrawable(null);
someButton.setBackgroundResource(R.drawable.animation);
これは最初にそれを停止します(おそらく必要ありません)。次に、背景のアニメーションを強制終了します。最後に、背景を再作成します。
これにより、stop()
が呼び出されるとすぐに、(AnimationDrawable)timerAnimation
が最初のフレームに送信されます。
timerAnimation.stop();
timerAnimation.selectDrawable(0);
別の可能な解決策は、最初のフレームと最後のフレームに同じ画像を使用し、stop()メソッドを呼び出す代わりに以下を実行することです。
((AnimationDrawable)(someButton.getBackground())).setOneShot(true);
誰かがこれをさらに詳しく調べたら。 setVisible(boolean visible、boolean restart)というメソッドもあります。しかし、それは私にとってはうまくいきませんでした。
public boolean setVisible (boolean visible, boolean restart)
を試すと、アニメーションが1回再生されます。例えば:
animationDrawable.setVisible(false, true);