2011-08-17 24 views
0

我試圖改變按鈕上的圖像,並將它們變回原始圖像,並在4個不同的圖像中一個接一個地完成它。如何在ImageButtons上一個接一個地更改圖像?

我曾嘗試下面的代碼,但它沒有工作,結果造成只有一個圖像閃爍的milisecond:

ArrayList<Integer> scenario = new ArrayList<Integer>(); 

... 

void delayedPlay(){ 
    // each button should be posted in 1 second spacing 
    int count = 1; 
    for (final int btnid : scenario){ 
     // turn off 
     final Runnable r2 = new Runnable(){ 
      public void run(){ 
       imagebuttons[btnid].setImageBitmap(imagesTurnedOff.get(btnid)); 
       } 
     }; 

     // turn on and call turn off 
     Runnable r1 = new Runnable(){ 
      public void run(){ 
       imagebuttons[btnid].setImageBitmap(imagesTurnedOn.get(btnid)); 
       imagebuttons[btnid].postDelayed(r2, 1000); 
       } 
     }; 

     // post the above delayed 
     imagebuttons[btnid].postDelayed(r1, 1000 * count++); 
    } 
} 

誰能幫助我,並說明爲什麼它不不爲我工作?

回答

1

它爲我工作。你確定imagesTurnedOn/imagesTurnedOff正在返回正確的值嗎?

這個解決方案在時間上有很多不足之處 - 它會非常不平衡。或許,這樣的事情會更好地工作(使用的AsyncTask)

public void deplayedPlay2() { 
    if (mTaskHandler == null) { 
     mTaskHandler = new AsyncTask<Void, Void, Void>() { 
      @Override 
      public Void doInBackground(Void... params) { 
       long now = System.currentTimeMillis(); 
       try { 
        for (final int btnid : mScenario) { 
         Log.d(TAG, 
           "ON: " + btnid + " (" + (System.currentTimeMillis() - now) + ")"); 
         mButtons[btnid].post(new Runnable() { 
          public void run() { 
           mButtons[btnid] 
             .setBackgroundDrawable(GoodbyeAndroidActivity.this 
               .getResources() 
               .getDrawable(
                 R.drawable.on_icon)); 

          } 
         }); 
         Thread.sleep(1000); 
         Log.d(TAG, 
           "OFF: " + btnid + " (" + (System.currentTimeMillis() - now) + ")"); 
         mButtons[btnid].post(new Runnable() { 
          public void run() { 
           mButtons[btnid] 
             .setBackgroundDrawable(GoodbyeAndroidActivity.this 
               .getResources() 
               .getDrawable(
                 R.drawable.off_icon)); 
          } 
         }); 
        } 
       } catch (InterruptedException ex) { 
        Log.d(TAG, "Interrupted."); 
       } 
       return null; 
      } 

      @Override 
      public void onPostExecute(Void param) { 
       Log.d(TAG, "Done!"); 
       mTaskHandler = null; 
      } 
     }; 
     mTaskHandler.execute(); 
    } 
} 

不要忘記的onPause()來處理這個問題:

public void onPause() { 
    super.onPause(); 
    if (mTaskHandler != null) { 
     mTaskHandler.cancel(true); 
     // May want to reset buttons too? 
    } 
} 
+0

美麗!奇蹟般有效!謝謝!順便說一句 - 爲什麼你寫:long now = System.currentTimeMillis(); ? – Ofershap

+0

我想查看相對於AsyncTask何時開始的時間點 - 僅用於Log.d消息。我在測試原始實現時將該代碼放入。它的工作,但正如我所說,時間非常不平衡。很高興它適合你。 – Jason

相關問題