⾳乐播放之进度条-⾃定义
[要求]
1. 进度条控件打算使⽤系统提供的SeekBar
2. SeekBar 要⽀持拖拉功能即:定点播放
3. SeekBar 要反映播放位置即:播放到哪 SeekBar 就在哪
[原理]
1. ⾳乐定点播放:MediaPlayer.seekTo(int msecond) //单位:毫秒
2. ⾳乐⽂件播放时间:Duration()
3. SeekBar 获取位置:Progress()
4. SeekBar 最⼤值: Max()
[组件]
1、Button :播放控制如:暂停继续
2、TextView :显⽰播放百分⽐
3、SeekBar :进度条
4、RadioGroup :显⽰所有sdcard ⾳乐⽂件
[代码步骤]
1. 定义界⾯:l
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="<a
href="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="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"
18. />
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 初始化
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 且播放指定位置的⾳乐
1.
2. sBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
3. @Override
4. public void onProgressChanged(SeekBar seekBar, int progress,
5. boolean fromUser) {
6. // TODO Auto-generated method stub
7.
8. }
9. @Override
10. public void onStartTrackingTouch(SeekBar seekBar) {
11. // TODO Auto-generated method stub
12. }
13. @Override
14. public void onStopTrackingTouch(SeekBar seekBar) {
15. // TODO Auto-generated method stub
16. int dest = Progress();
17.
18. int mMax = Duration();
19. int sMax = Max();
20.
21. mPlayer.seekTo(mMax*dest/sMax);
22.
23. }
24.
25. });
复制代码
4. 刷新播放位置且使其实时变化
//因为MediaPlayer没有播放进度的回调函数所以只能:开辟⼀个Thread 定时通知其刷新
1.
2. public void startProgressUpdate(){
3. //开辟Thread ⽤于定期刷新SeekBar
4. DelayThread dThread = new DelayThread(100);
5. dThread.start();
6. }
复制代码
⽽该Thread 具体实现为:
1.
2. private Handler mHandle = new Handler(){
3. @Override
android radiogroup4. public void handleMessage(Message msg){
5. int position = CurrentPosition();
6.
7. int mMax = Duration();
8. int sMax = Max();
9.
10. sBar.setProgress(position*sMax/mMax);
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小时内删除。
发表评论