2017-05-15 28 views
0

我嘗試做一個幻燈片,當我點擊一個按鈕時,ImageView將顯示所有的圖片/整數圖片[]可以一次一個連續以一個設定的間隔速度,我將從單選按鈕(3選擇)在屏幕上。如何使用AsyncTask以設定的時間間隔逐個加載多個圖像到ImageView?

我嘗試在沒有AsyncTask的情況下一次一個地顯示圖像,但是它只顯示最後一張圖像,並且不顯示每張圖片之間的時間延遲。

for (Integer p:pics) 
{ 
    iv.SetImageResource(p); 
    SystemClock.sleep(500); 
} 

下面的代碼是我到目前爲止,我需要幫助上的AsyncTask的底部,如何在設置間隔時間達到一個個圖像

public class PhotoAlbum extends Activity 
{ 
    static final int intSlow = 3000; 
    static final int intMed = 1000; 
    static final int intFast = 500; 

    ImageView iv; 
    int interval; 
    Integer pics[] = { 
     R.drawable.img1, 
     R.drawable.img2, 
     R.drawable.img3, 
     R.drawable.img4, 
     R.drawable.img5, 
     R.drawable.img6 
    }; 

    RadioButton rbSlow; 
    RadioButton rbMedium; 
    RadioButton rbFast; 
    Button mAutoButton; 

    private int currentImage = 0; 

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

     iv = (ImageView) findViewById(R.id.imageView); 
     iv.setImageResource(pics[currentImage]); 

     rbSlow = (RadioButton) findViewById(R.id.radioSlow); 
     rbMedium = (RadioButton) findViewById(R.id.radioMedium); 
     rbFast = (RadioButton) findViewById(R.id.radioFast); 

     mAutoButton = (Button) findViewById(R.id.buttonAuto); 

     mAutoButton.setOnClickListener(AutoButtonChangeImageListener); 

    } 
    private View.OnClickListener AutoButtonChangeImageListener = new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      AutoPicsTask.execute(); 
     } 
    }; 

    private class AutoPicsTask extends AsyncTask<Integer, Void, Integer> 
    { 
     if (rbSlow.isChecked()) 
     { 
      interval = intSlow; 
     } else if (rbMedium.isChecked()) 
     { 
      interval = intMed; 
     } else 
     { 
      interval = intFast; 
     } 

     @Override 
     protected Integer doInBackground(Integer... params) 
     { 
      for (Integer p : pics) 
      { 
       SystemClock.sleep(interval); 
      } 
      return null; 
     } 

     protected void onPostExecute(Integer ...value) { 
      iv.setImageResource(value[0]); 
     } 
    } 
} 

對不起,我對於AsyncTask來說真的很新。

這是一個使用我們迄今爲止學到的作業。 我們還沒有學習如何使用「處理程序」,計時器,runOnUiThread(),創建一個線程,void run(),postDelayed(),動畫,我看到一些建議用於一次實現一個圖像。

在此先感謝。

+0

'謝謝。不要說你在課程中學到了這種壞習慣。 – greenapps

回答

0

您正在設置onPostExecute中的圖像資源。您必須在SystemClock.sleep(間隔)之後或之前執行此操作。在doInBackground()中,您不能更改UI元素,但當然有一個解決方案。

使用runInUiThread()方法。它需要一個可運行的對象。在裏面設置你的imageView。

for (Integer p : pics){ 
      SystemClock.sleep(interval); 
      runOnUiThread(new Runnable(){ 
      @Override 
       public void run() { 
        iv.setImageResource(p); 
       } 
      }); 
} 
+0

謝謝。但是我們還沒有學習如何使用runOnUiThread()方法。我們目前只使用我們在課堂上學到的東西。 – Ken

+0

你不允許使用其他東西嗎? – greenapps

+0

因爲AsyncTask具有publishProgress/onProgressUpdate,所以在AsyncTask中使用runInBackground的想法不妙。 – greenapps

0

我使用此代碼作爲定時器advance.`

CountDownTimer timer = new CountDownTimer(6000, 1000) { //this will make 5 minute delay 

     @Override 
     public void onTick(long millisUntilFinished) { 

      // write the code of changing pictures 
     } 

     @Override 
     public void onFinish() { 
      try{ 

       //write the code when finishing 
      }catch(Exception e){ 

      } 
     } 
    }.start(); 
+0

thansk。但我們沒有學習如何使用計時器。 – Ken

+0

什麼是非現實。你看這裏是如何使用它的。所以抓住它。然後你又學到了。 – greenapps

+0

我們的老師只是想讓我們練習使用教給我們的東西......這個帖子並沒有浪費。如果我處理同樣的問題,現在我將知道在將來使用計時器。 – Ken

相關問題