2010-06-03 44 views
25

Tôi đang viết trình phát đa phương tiện và tôi muốn có thanh tiến trình hiển thị tiến trình của bài hát. Tôi tìm thấy các lớp ProgressBar, nhưng tất cả tôi có thể nhận được trên màn hình là một biểu tượng quay tròn. những gì im tìm kiếm là một thanh thực tế.Tôi làm cách nào để sử dụng Android ProgressBar ở chế độ xác định?

Làm cách nào để thay đổi kiểu của ProgressBar thành một thanh (không phải là hình tròn) và tôi sẽ sử dụng nó như thế nào với MediaPlayer?

nhờ

Trả lời

56

sử dụng phong cách ?android:attr/progressBarStyleHorizontal

ví dụ:

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

và đây là một ví dụ với 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

Cảm ơn điều này hoạt động tốt, nó chỉ thiếu một dòng: bạn cần đặt vị trí tối đa (setMax (tổng)) trước khi bạn bắt đầu vòng lặp while hoặc thanh sẽ chuyển thẳng đến 100%. thankyou! – mtmurdock

+0

hello tôi không thể nhìn thấy thanh lúc 100% lúc bắt đầu, tôi đặt progressBar.setMax (mp.getDuration()); và sau đó Thực hiện chuỗi có chứa vòng lặp while để cập nhật tiến trình, chủ đề mới (this) .start(); =) – Jorgesys

+27

Không, đây không phải là mô hình luồng hợp lệ cho Android. KHÔNG tạo chủ đề của riêng bạn và sau đó sửa đổi giao diện người dùng từ bên trong chuỗi đó. Bạn PHẢI tuân thủ các quy tắc của Android hoặc bạn sẽ tạo một lỗi khó tìm thấy ... Thay vào đó, hãy thực hiện điều này ... http://developer.android.com/resources/articles/painless-threading.html –

0

lập trình:

progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleHorizontal); 
progressBar.setIndeterminate(false); 
Các vấn đề liên quan