2017-01-31 23 views
2

AnimationDrawableを使用して一連の画像をアニメーション化しようとしています。ユーザーはボタンをクリックするだけでアニメーションを一時停止/再開することができます。私はsetVisible(boolean visible, boolean restart)を使ってそうしています。ドキュメントを正しく理解しているかどうかは完全にはわかりませんが、一時停止を押すたびにアニメーションが最初から開始されます。AnimationDrawableを一時停止して同じフレームから再開

同じフレームからアニメーションを再開する方法はありますか? AnimationDrawable APIから

:再起動がfalseの場合

...、描画可能ただ明確にすることが最も最近のフレームから

を再開します。

activityAnimation.setVisible(false, false);は、アニメーションを停止する必要があります。

activityAnimation.setVisible(true, false);同じフレームからアニメーションを再開する必要があります(そうではありません)。ここで


私のコードは次のとおりです。

アニメーションstart()onWindowFocusChangedに呼ばれています。

アニメーションやボタンがonCreateで作成されているが:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_content); 

    ImageView activityImage = (ImageView) findViewById(R.id.activity_image); 
    activityImage.setBackgroundResource(R.drawable.anim); 
    activityAnimation = (AnimationDrawable) activityImage.getBackground(); 

    .... 
    b.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ImageButton b = (ImageButton) v; 
      if ((Integer)b.getTag() == R.drawable.pause) { 
       b.setImageResource(R.drawable.play); 
       b.setTag(R.drawable.play); 
       activityAnimation.setVisible(false, false); 
      } else { 
       b.setImageResource(R.drawable.pause); 
       b.setTag(R.drawable.pause); 
       activityAnimation.setVisible(true, false); 
      } 
     } 
    });... 
} 

これは、私はこれらの古いポストのいくつか気づいた

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="false"> 

    <item android:drawable="@drawable/one" android:duration="1000" /> 
    <item android:drawable="@drawable/two" android:duration="1000" /> 
    <item android:drawable="@drawable/three" android:duration="1000" /> 
    <item android:drawable="@drawable/four" android:duration="1000" /> 

</animation-list> 

XMLファイルの内容ですが、非は答えを持っていました。

How to reset AnimationDrawable(この問題の反対側)

How do I pause frame animation using AnimationDrawable? [Closed]

+0

この現象はAndroidのどのバージョンで発生していますか? – Luksprog

+0

私はGenymotion(Galaxy s5 - 4.4.4 - API19)を使っています。 Androidスタジオ2.2.3、最新SDK – Idan

+0

APIレベルの端末(Lollipop以上)を試して、問題が解決するかどうかを確認してください。AnimationDrawableのコードを見てきましたが、下位バージョンではアニメーションを再起動するだけで、上位バージョンでは現在のフレームからアニメーション化するロジックがあるようです。 – Luksprog

答えて

0

私は私の場合の答えが実行可能ImageView背景を置き換える毎秒を作成するだけだった、だけでなく、画面上のタイマーを必要とするので。ここで

が一般的な考え方です:

  1. は実行可能、ImageViewといくつかのヘルパーの作成:OnCreate

    ImageView exImage = null; 
    
    long startTime = 0; 
    long pauseTime = 0; 
    long pauseStartTime = 0; 
    
    List<Integer> animList = new ArrayList<>(); 
    int animIt = 0;   
    
    Handler timerHandler = new Handler(); 
    Runnable timerRunnable = new Runnable() { 
        @Override 
        public void run() { 
    
         long millis = System.currentTimeMillis() - startTime - pauseTime; 
         double dSecs = (double) (millis/100); 
         int pace = 10; 
    
         if (dSecs % pace == 0.0 && !animList.isEmpty()) { 
          animIt = (animIt == animList.size() - 1) ? 0 : animIt + 1; 
          exImage.setBackgroundResource(animList.get(animIt)); 
         } 
         timerHandler.postDelayed(this, 100); 
        } 
    }; 
    
  2. を、一時停止し、再生ボタンをバインドするタイマーを起動して最初に設定ImageView

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_exercise); 
    
        // Set the image view 
        exImage = (ImageView) findViewById(R.id.image_zero); 
        exImage.setBackgroundResource(R.drawable.fe_0); 
    
        // Start the timer 
        timerHandler.postDelayed(timerRunnable, 0); 
    
        // Bind the buttons 
        ImageButton pp = (ImageButton) findViewById(R.id.button_play_pause_toggle); 
        pp.setImageResource(R.drawable.pause); 
        pp.setTag(R.drawable.pause); 
    
        pp.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          ImageButton pp = (ImageButton) v; 
          //Pause 
          if ((Integer) pp.getTag() == R.drawable.pause) { 
           pauseStartTime = System.currentTimeMillis(); 
           timerHandler.removeCallbacks(timerRunnable); 
          } else { // Resume 
           pauseTime += System.currentTimeMillis() - pauseStartTime; 
           timerHandler.postDelayed(timerRunnable, 0); 
          } 
         } 
        }); 
    } 
    
関連する問題