2012-11-03 180 views
2

全部,動態更改imageView中的位圖,android

我有一個關於imageView,android的問題。
我有一個數組,其中包含10個位圖對象,稱爲bm
我有一個imageView,叫做im

現在我想通過一個顯示IM一個數組中的位圖,所以我做了以下內容:

new Thread(new Runnable() { 
     public void run() { 
     for(int j=0;j<10;j++){ 
      im.setImageBitmap(bm[j]); 
     } 
     } 
     }).start(); 

但結果只顯示在陣列中的最後一個位圖。

誰能告訴我這個問題怎麼辦?

數以百萬計的感謝!

+0

順便說一句,這大塊的代碼是一個活動的onCreate()方法。 –

回答

1
  1. 永遠不要更改UI元素在一個線程。大多數情況下,這會導致例外。我不知道爲什麼它不在這裏。

  2. 你通過在短短毫秒所有十張圖片爆破。這就是爲什麼最後一個是你看到的唯一一個。你需要放慢速度。

  3. 最簡單的方法將是處理程序/可運行執行像這樣:

    im.post(new Runnable() { 
        int j = 0;  
        @Override 
        public void run() { 
         im.setImageBitmap(bm[j]); 
         if(j++ < 10){ 
         im.postDelayed(this, 1000); 
         } 
        } 
    }); 
    
+0

謝謝先生,你剛纔說永遠不要改變線程中的UI元素,那麼最好的方法是什麼? –

+0

這在UI線程上運行,所以這是一種你可以做到的方式。 Dmytro的回答是另一種方式。 – DeeV

+0

nvm然後,我只是瞭解你的代碼,非常感謝你的先生 –

1

您需要設置一個新的形象後插入sleep通話,使你的眼睛將要看到的圖像:)的機會。例如:

im.setImageBitmap(bm[j]); 
try {        
    Thread.sleep(5000);   
} catch (InterruptedException e) { 
    e.printStackTrace();   
}  

在進入下一個圖像之前應該保持圖像五秒鐘。

像其他人所說,你需要使用postDelayed正確地通知您設置一個位圖的UI。

1
  1. 你應該有例外,因爲你只能在UI線程中使用視圖。 如果您想對其進行更改,則應在視圖上調用post方法。
  2. 實際上它變化的很快,你只能看到最後一個項目。

下面是正確的代碼:

new Thread(new Runnable() { 
     public void run() 
     { 
      for (int j = 0; j < 10; j++) 
      { 
       final int index = j; 
       im.postDelayed(new Runnable() { 

        @Override 
        public void run() 
        { 
         im.setImageBitmap(bm[index]); 
        } 
       }, j * 1000); // delay j seconds 
      } 
     } 
    }).start(); 
+0

我仍然認爲創建一個這樣的線程將是矯枉過正。無論如何,它都必須在用戶界面上運行。 – DeeV

+0

方法「postDelayed」在UI線程上調用,我錯過了什麼? –

+0

這是,但你也創建一個線程來循環10次循環來調用UI線程上的方法。它會工作,但它似乎是多餘的。 – DeeV