音乐播放之进度条
[前提]
* android 自身也提供了该接口 似乎是:MediaController 但看过截图 发现极丑 所以今天就自己写了一个 现于诸位分享分享
[要求]
1. 进度条控件打算使用系统提供的SeekBar
2. SeekBar 要支持拖拉功能 即:定点播放
3. SeekBar 要反映播放位置 即:播放到哪 SeekBar 就在哪
[原理]
1. 音乐定点播放:MediaPlayer.seekTo(int msecond) //单位:毫秒
2. 音乐文件播放时间:Duration()
3. SeekBar 获取位置:Progress()
4. SeekBar 最大值: Max()
[代码 步骤]
1. 定义界面:l
Java代码
1. 1 * Button : 播放控制 如:暂停 继续
2. 1 * TextView : 显示播放百分比
3. 1 * SeekBar : 进度条
4. 1 * RadioGroup : 显示所有sdcard 音乐文件
Java代码
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="<a href="http://schemas.android/apk/res/android">
schemas.android/apk/res/android</a>"
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7. <LinearLayout xmlns:android="<a href="http://schemas.android/apk/res/android">schemas.android/apk/res/android</a>"
8. android:orientation="horizontal"
9. android:layout_width="fill_parent"
10. android:layout_height="wrap_content"
11. >
12. <Button
13. android:id="@+id/cmd"
14. android:text=""
15. android:layout_width="90dip"
16. android:layout_height="wrap_content"
17. android:singleLine="true"
android radiogroup18. />
19. <TextView
20. android:id="@+id/progress"
21. android:text="Progress.."
22. android:layout_width="50dip"
23. android:layout_height="fill_parent"
24. android:gravity="center"
25. android:singleLine="true"
26. />
27. </LinearLayout>
28. <SeekBar
29. android:id="@+id/seekb"
30. android:max="100"
31. android:layout_width="fill_parent"
32. android:layout_height="wrap_content"
33. />
34. </LinearLayout>
2. View 初始化
Java代码
1. public void initialize(){
2.
3. sBar = (SeekBar)findViewById(R.id.seekb);
4. rGroup = (RadioGroup)findViewById(R.id.radio);
5. cmdButton = (Button)findViewById(d);
6.
7. mPlayer = new MediaPlayer();
8. }
3. 拖动SeekBar 且播放指定位置的音乐
Java代码
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 =&Progress();
19.
20. int mMax =&Duration();
21. int sMax =&Max();
22.
23. mPlayer.seekTo(mMax*dest/sMax);
24.
25. }
26.
27. });
4. 刷新播放位置 且使其实时变化
//因为MediaPlayer没有播放进度的回调函数 所以只能:开辟一个Thread 定时通知其刷新
Java代码
1. public void startProgressUpdate(){
2. //开辟Thread 用于定期刷新SeekBar
3. DelayThread dThread = new DelayThread(100);
4. dThread.start();
5. }
而该Thread 具体实现为:
Java代码
1. private Handler mHandle = new Handler(){
2. @Override
3. public void handleMessage(Message msg){
4. int position =&CurrentPosition();
5.
6. int mMax =&Duration();
7. int sMax =&Max();
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. }
5. emulator 运行截图:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论