web-dev-qa-db-ja.com

AnimationDrawableをリセットする方法

私は円形のカウントダウンタイマーをアニメーション化する必要があり、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を表示しています。 (ここでの開始インデックスは、一時停止ボタンがタップされたときの最後の非表示フレームに設定されます。)

どんなアイデアでも大歓迎です。

ありがとう

33
Levente Kürti

現在のフレームでアニメーションを停止すると同じ問題が発生しました。私はそれがiOSのように振る舞うことを望んだ、そこで停止は最初のフレームに戻るであろう。この解決策は私にとってはうまくいきます:

((AnimationDrawable)(someButton.getBackground())).stop();
someButton.setBackgroundDrawable(null);
someButton.setBackgroundResource(R.drawable.animation);

これは最初にそれを停止します(おそらく必要ありません)。次に、背景のアニメーションを強制終了します。最後に、背景を再作成します。

13
JoJo

これにより、stop()が呼び出されるとすぐに、(AnimationDrawable)timerAnimationが最初のフレームに送信されます。

timerAnimation.stop();
timerAnimation.selectDrawable(0);
85
Tigger

別の可能な解決策は、最初のフレームと最後のフレームに同じ画像を使用し、stop()メソッドを呼び出す代わりに以下を実行することです。

((AnimationDrawable)(someButton.getBackground())).setOneShot(true);

誰かがこれをさらに詳しく調べたら。 setVisible(boolean visible、boolean restart)というメソッドもあります。しかし、それは私にとってはうまくいきませんでした。

2
Proxy32

public boolean setVisible (boolean visible, boolean restart)を試すと、アニメーションが1回再生されます。例えば:

animationDrawable.setVisible(false, true);
2
M.L.Lee