2017-05-15 3 views
0

Ich versuche, eine Slideshow zu machen, wenn ich auf einen Button klicke, ImageView zeigt alle Bilder/Zeichen aus Integer - Bildern [] einzeln nacheinander mit einer eingestellten Intervallgeschwindigkeit an, die ich aus den Radiobuttons (3 Auswahlmöglichkeiten) auf dem Bildschirm.Wie werden mehrere Bilder nacheinander in ImageView in einem festgelegten Intervall mit AsyncTask geladen?

Ich versuche, Bild für Bild ohne AsyncTask zu zeigen, mit dem folgenden, aber es zeigt nur das letzte Bild und keine Zeitverzögerung zwischen den einzelnen Bildern.

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

der folgende Code ist, was ich bisher habe, muss ich auf dem Boden des AsyncTask helfen auf, wie

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]); 
     } 
    } 
} 

Leider in einem festgelegten Intervall Zeit eins nach dem anderen Bild zu erreichen, ich bin wirklich neu in AsyncTask.

Dies ist eine Zuordnung mit dem, was wir bisher gelernt haben. Wir haben nicht gelernt, wie man "handler", timer, runOnUiThread(), erstellen einen Thread, void run(), postDelayed(), animieren, die ich sehe einige der Post suggerate zu verwenden, um ein Bild zu einem Zeitpunkt zu erreichen .

danke im voraus.

+0

'Dank in advance.'. Sagen Sie nicht, dass Sie diese schlechte Angewohnheit im Verlauf gelernt haben. – greenapps

Antwort

0

Sie setzen Bildressourcen in onPostExecute. Sie müssen dies nach oder vor SystemClock.sleep (Intervall) tun. In doInBackground() können Sie keine UI-Elemente ändern, dafür gibt es natürlich eine Lösung.

Verwenden Sie die runInUiThread() - Methode. es braucht ein lauffähiges Objekt. Stellen Sie Ihr ImageView darin ein.

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

danke. Aber wir haben nicht gelernt, wie man die Methode runOnUiThread() benutzt. Wir verwenden nur das, was wir bisher im Unterricht gelernt haben. – Ken

+0

Können Sie andere Dinge nicht verwenden? – greenapps

+0

Schlechte Idee, runInBackground in einer AsyncTask zu verwenden, da die AsyncTask nur dafür publishProgress/onProgressUpdate hat. – greenapps

0

Ich verwende diesen Code als Timer

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. aber wir haben nicht gelernt, wie man Timer benutzt. – Ken

+0

Was für eine Nichtigkeit. Sie sehen, wie es hier verwendet wird. Also nimm es. Und dann hast du wieder gelernt. – greenapps

+0

Unser Lehrer möchte nur, dass wir üben, was uns beigebracht wird ... die Post wurde nicht verschwendet. Ich werde jetzt wissen, den Timer in der Zukunft zu verwenden, wenn ich mich demselben Problem annähere. – Ken

Verwandte Themen