2010-06-03 10 views
25

Sto scrivendo un lettore multimediale e mi piacerebbe avere una barra di avanzamento che mostra lo stato di avanzamento del brano. Ho trovato la classe ProgressBar, ma tutto quello che posso ottenere sullo schermo è un'icona circolare che gira. quello che sto cercando è un bar reale.Come utilizzare Android ProgressBar in modalità determinata?

come faccio a cambiare lo stile del ProgressBar per essere un bar (non un cerchio) e come dovrei usarlo con MediaPlayer?

grazie

risposta

56

utilizzare lo stile ?android:attr/progressBarStyleHorizontal

ad esempio:

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

e questo è un esempio con 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

Grazie a questo funziona, manca solo una linea: è necessario impostare la posizione massima (setMax (totale)) prima di iniziare il ciclo while o la barra andrà diritto al 100%. grazie! – mtmurdock

+0

ciao non riesco a vedere la barra al 100% all'inizio, ho impostato progressBar.setMax (mp.getDuration()); e quindi Esegui il thread che contiene il ciclo while per aggiornare la progressBar, new Thread (this) .start(); =) – Jorgesys

+27

No, questo non è il modello di threading valida per Android. NON creare il proprio thread e quindi modificare l'interfaccia utente all'interno di quel thread. DEVI seguire le regole di Android, o creerai un bug che è difficile da trovare ... Invece fai questo ... http://developer.android.com/resources/articles/painless-threading.html –

0

di programmazione:

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