標籤:
今天學渣研究了一下使用MediaPlayer播放音樂時加入進度條,進度條如今用的是android內建的seekbar,後期會跟換UI的,在之前可以播放音樂的基礎上,如今加入的主要功能有兩個:
1即時顯示播放進度
2手動調節播放進度
如今學渣建立了一個項目來進行測試,後期會和之前部落格介紹的滑動頁面進行整合,預計會在service建好後整合,敬請期待。。。。
好了先上:
關於使用進度條的基本原理非常easy,用到了幾個參數:
1 歌曲的時間長度:單位為毫秒,MediaPlayer的getDuration(),只是要注意getDuration()的使用狀態,在這篇部落格中介紹了MediaPlayer的各個狀態,大家能夠去看看。
2 進度條的長度:android裡進度條的長度預設應該是100,單位不詳,沒影響
3 當前進度:對於歌曲而言,當前進度是當前播放的歌曲所在位置,單位毫秒,對於進度條而言,是在進度條中所佔的比例。主要是對這兩個進行轉化。
兩個功能:
1因為進度須要即時更新,因此在系統中用一個線程對UI線程發訊息(每隔100毫秒),在UI線程中用Handler捕獲訊息,通過MediaPlayer的getCurrentPosition得到當前位置,進而計算seekbar相應的位置,對seekbar及時進行更新。
2對於手動調節歌曲進度時,通過擷取調節到的位置,通過SeekBar.OnSeekBarChangeListener()監聽滑動條,當滑動條調節位置確定後,通過onStopTrackingTouch()及時更新歌曲的進度,用MediaPlayer的seekTo(單位是毫秒)調節歌曲的進度。
詳細代碼例如以下:
public class MainActivity extends Activity {MediaPlayer mediaPlayer;SeekBar seekBar;//本地歌曲的路徑String path = "/storage/sdcard1/Music/浪漫滿屋.mp3";//處理進度條更新Handler mHandler = new Handler(){@Override public void handleMessage(Message msg){ switch (msg.what){case 0://更新進度int position = mediaPlayer.getCurrentPosition(); int time = mediaPlayer.getDuration(); int max = seekBar.getMax(); seekBar.setProgress(position*max/time); break; default: break;} } };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();//初始化播放buttonButton playButton = (Button)findViewById(R.id.playButton);playButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "time is "+mediaPlayer.getDuration(), 1000).show();play();}});//初始化暫停buttonButton pauseButton = (Button)findViewById(R.id.pauseButton);pauseButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubpause();}}); seekBar = (SeekBar)findViewById(R.id.seekbar);seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//手動調節進度// TODO Auto-generated method stubint dest = seekBar.getProgress();int time = mediaPlayer.getDuration();int max = seekBar.getMax();mediaPlayer.seekTo(time*dest/max);}@Overridepublic void onStartTrackingTouch(SeekBar arg0) {// TODO Auto-generated method stub}@Overridepublic void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {// TODO Auto-generated method stub}});}//初始化音樂播放void init(){//進入IdlemediaPlayer = new MediaPlayer();try {//初始化mediaPlayer.setDataSource(path); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // prepare 通過非同步方式裝載媒體資源mediaPlayer.prepareAsync();//後台線程發送訊息進行更新進度條final int milliseconds = 100;new Thread(){@Overridepublic void run(){while(true){ try { sleep(milliseconds); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } mHandler.sendEmptyMessage(0); } }}.start();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//測試播放音樂void play(){mediaPlayer.start();}//暫停音樂 private void pause() { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); } } //activity 退出時,停止播放音樂,釋放資源@Overrideprotected void onDestroy() { // 在activity結束的時候回收資源 if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } super.onDestroy(); }@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
android 播放音樂-進度條