[前提]
* android 自身也提供了该接口 似乎是:MediaController 发现极丑
[要求]
1. 进度条控件打算使用系统提供的SeekBar
2. SeekBar 要支持拖拉功能 即:定点播放
3. SeekBar 要反映播放位置 即:播放到哪 SeekBar 就在哪
[原理]
1. 音乐定点播放:MediaPlayer.seekTo(int msecond) //单位:毫秒
2. 音乐文件播放时间:MediaPlayer.getDuration()
3. SeekBar 获取位置:SeekBar.getProgress()
4. SeekBar 最大值: SeekBar.getMax()
[代码 步骤]
定义界面:main.xml
* Button : 播放控制 如: 暂 停 继续
* TextView : 显 示播放百分比
* SeekBar : 进 度条
* RadioGroup : 显 示所有sdcard 音 乐 文件
1. 2.
View初始化
1. public void initialize(){ 2. 3. sBar = (SeekBar)findViewById(R.id.seekb); 4. rGroup = (RadioGroup)findViewById(R.id.radio); 5. cmdButton = (Button)findViewById(R.id.cmd); 6. 7. mPlayer = new MediaPlayer(); 8. }
拖动SeekBar,且播放指定位置的音乐
1. sBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){ 2. 3. @Override 4. public void onProgressChanged(SeekBar seekBar, int progress, 5. boolean fromUser) { 6. // TODO Auto-generated method stub 7. 8. } 9. 10. @Override 11. public void onStartTrackingTouch(SeekBar seekBar) { 12. // TODO Auto-generated method stub 13. } 14. 15. @Override 16. public void onStopTrackingTouch(SeekBar seekBar) { 17. // TODO Auto-generated method stub 18. int dest = seekBar.getProgress(); 19. 20. int mMax = mPlayer.getDuration(); 21. int sMax = sBar.getMax(); 22. 23. mPlayer.seekTo(mMax*dest/sMax); 24. 25. } 26. 27. });
刷新播放位置,且使其实时变化
//mediaplayer没有播放进度的回调函数,所以只能开辟一个Thread定时使其刷新
1. public void startProgressUpdate(){ 2. //开辟Thread 用于定期刷新SeekBar 3. DelayThread dThread = new DelayThread(100); 4. dThread.start(); 5. }
Thread具体实现代码:
1. private Handler mHandle = new Handler(){ 2. @Override 3. public void handleMessage(Message msg){ 4. int position = mPlayer.getCurrentPosition(); 5. 6. int mMax = mPlayer.getDuration(); 7. int sMax = sBar.getMax(); 8. 9. sBar.setProgress(position*sMax/mMax); 10. } 11. }; 12. 13. public class DelayThread extends Thread { 14. int milliseconds; 15. 16. public DelayThread(int i){ 17. milliseconds = i; 18. } 19. public void run() { 20. while(true){ 21. try { 22. sleep(milliseconds); 23. } catch (InterruptedException e) { 24. // TODO Auto-generated catch block 25. e.printStackTrace(); 26. } 27. 28. mHandle.sendEmptyMessage(0); 29. } 30. } 31. }
样图: