android 播放音樂-進度條

來源:互聯網
上載者:User

標籤:

今天學渣研究了一下使用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 播放音樂-進度條

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.