2010-06-03 11 views
25

J'écris un lecteur multimédia et je voudrais avoir une barre de progression montrant la progression de la chanson. J'ai trouvé la classe ProgressBar, mais tout ce que je peux obtenir à l'écran est une icône de rotation circulaire. ce que je cherche est une barre réelle. Comment changer le style du ProgressBar pour qu'il devienne une barre (pas un cercle) et comment l'utiliser avec MediaPlayer?Comment utiliser Android ProgressBar en mode déterminé?

grâce

Répondre

56

utiliser le style ?android:attr/progressBarStyleHorizontal

par exemple:

<ProgressBar android:id="@+id/progressBar" 
     style="?android:attr/progressBarStyleHorizontal" 

et ceci est un exemple avec MediaPlayer:

package com.playerpgbar; 

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

public class Player extends Activity implements Runnable, OnClickListener { 

    private TextView status; 
    private ProgressBar progressBar; 
    private Button startMedia; 
    private Button stop; 
    private MediaPlayer mp;  

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     status = (TextView) findViewById(R.id.status); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar); 
     startMedia = (Button) findViewById(R.id.startMedia); 
     stop = (Button) findViewById(R.id.stop); 

     startMedia.setOnClickListener(this); 
     stop.setOnClickListener(this);     
    }   

    @Override 
    public void onClick(View v) { 
     if (v.equals(startMedia)) { 
      if (mp != null && mp.isPlaying()) return; 
      mp = MediaPlayer.create(Player.this, R.raw.exodus_piranha); 
      mp.start();    
      status.setText(R.string.PlayingMedia);   
      progressBar.setVisibility(ProgressBar.VISIBLE); 
      progressBar.setProgress(0); 
      progressBar.setMax(mp.getDuration()); 
      new Thread(this).start(); 
     } 

     if (v.equals(stop) && mp!=null) { 
      mp.stop(); 
      mp = null;    
      status.setText(R.string.Stopped); 
      progressBar.setVisibility(ProgressBar.GONE); 
     } 
    } 

    @Override 
    public void run() { 
     int currentPosition= 0; 
     int total = mp.getDuration(); 
     while (mp!=null && currentPosition<total) { 
      try { 
       Thread.sleep(1000); 
       currentPosition= mp.getCurrentPosition(); 
      } catch (InterruptedException e) { 
       return; 
      } catch (Exception e) { 
       return; 
      }    
      progressBar.setProgress(CurrentPosition); 
     } 
    } 
} 
+0

Merci cela fonctionne bien, il manque juste une ligne: vous devez définir la position max (setMax (total)) avant de démarrer la boucle while ou la barre ira directement à 100%. merci! – mtmurdock

+0

bonjour je ne peux pas voir la barre à 100% au début, j'ai mis progressBar.setMax (mp.getDuration()); puis Exécutez le thread contenant la boucle while pour mettre à jour progressBar, new Thread (this) .start(); =) – Jorgesys

+27

Non, ce n'est pas un modèle de thread valide pour Android. Ne créez pas votre propre thread, puis modifiez l'interface utilisateur à partir de ce thread. Vous DEVEZ suivre les règles android, ou vous allez créer un bug qui est difficile à trouver ... Au lieu de faire cela ... http://developer.android.com/resources/articles/painless-threading.html –

0

Programmatically:

progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleHorizontal); 
progressBar.setIndeterminate(false);