首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

音乐播发之进度条 - 自定义

2012-09-06 
音乐播放之进度条 - 自定义音乐播放之进度条?[前提]* android 自身也提供了该接口 似乎是:MediaController

音乐播放之进度条 - 自定义

音乐播放之进度条

?

[前提]

* 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()

?

?

?

[代码 步骤]

1. 定义界面:main.xml

1 * Button : 播放控制 如:暂停 继续1 * TextView : 显示播放百分比1 * SeekBar : 进度条1 * RadioGroup : 显示所有sdcard 音乐文件

?

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"??? android:orientation="vertical"??? android:layout_width="fill_parent"??? android:layout_height="fill_parent"??? ><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"??? android:orientation="horizontal"??? android:layout_width="fill_parent"??? android:layout_height="wrap_content"??? ><Button?android:id="@+id/cmd"?android:text="Loading..."?android:layout_width="90dip"??? android:layout_height="wrap_content"??? android:singleLine="true"/><TextView?android:id="@+id/progress"?android:text="Progress.."?android:layout_width="50dip"??? android:layout_height="fill_parent"??? android:gravity="center"??? android:singleLine="true"/></LinearLayout><SeekBar? ?android:id="@+id/seekb"?android:max="100"??? android:layout_width="fill_parent" ??? android:layout_height="wrap_content" ??? /></LinearLayout>

?

2.? View 初始化

public void initialize(){        sBar = (SeekBar)findViewById(R.id.seekb);    rGroup = (RadioGroup)findViewById(R.id.radio);    cmdButton = (Button)findViewById(R.id.cmd);        mPlayer = new MediaPlayer();    }

?

3. 拖动SeekBar 且播放指定位置的音乐

sBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// TODO Auto-generated method stub}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stubint dest = seekBar.getProgress();int mMax = mPlayer.getDuration();    int sMax = sBar.getMax();        mPlayer.seekTo(mMax*dest/sMax);    }});

?

4. 刷新播放位置 且使其实时变化

//因为MediaPlayer没有播放进度的回调函数 所以只能:开辟一个Thread 定时通知其刷新

public void startProgressUpdate(){    //开辟Thread 用于定期刷新SeekBar    DelayThread dThread = new DelayThread(100);    dThread.start();    }

?

而该Thread 具体实现为:

private Handler mHandle = new Handler(){    @Override    public void handleMessage(Message msg){    int position = mPlayer.getCurrentPosition();        int mMax = mPlayer.getDuration();    int sMax = sBar.getMax();        sBar.setProgress(position*sMax/mMax);    }    };    public class DelayThread extends Thread {    int milliseconds;        public DelayThread(int i){    milliseconds = i;    }    public void run() {    while(true){    try {sleep(milliseconds);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}mHandle.sendEmptyMessage(0);    }    }    }

?

?

5. emulator 运行截图:

?音乐播发之进度条 - 自定义

?

?

?

1 楼 ucgfan 2010-04-11   马上添加进我之前写的player里进行尝试
但是发现拖动实现定点播放都没有问题
就是没有实时更新SEEKBAR
不知道是我添加错哪里了~ 2 楼 gryphone 2010-04-12   ucgfan 写道马上添加进我之前写的player里进行尝试
但是发现拖动实现定点播放都没有问题
就是没有实时更新SEEKBAR
不知道是我添加错哪里了~
可能是因为你没有启动DelayThread所致吧 你在Activity::onCreate() 最后加上如下代码:
startProgressUpdate()

3 楼 ucgfan 2010-04-12   恩,果然是没有启用的问题~
无限感谢~~自己做的player又完善了一点~~ 4 楼 lee306675730 2010-04-22   學習了,最近正剛開始學習android,
看到你們好牛。。奮鬥啊! 5 楼 zhouxiaoli521 2010-09-06   定点播放可以用一种更简单的方式
把音乐的总时间设置成进度条的最大值
musicProgressBar.setMax(mp.getDuration());

这样你在进度条上拖动的位置直接就可以定位到毫秒了
public void onStopTrackingTouch(SeekBar seekBar) {  
  mp.seekTo(musicProgressBar.getProgress());       
}

更新进度条也一样 直接把当前播放的时间定位到进度条就可以了
musicProgressBar.setProgress(mp.getCurrentPosition());
6 楼 ableouou 2010-09-06   建议不要用音乐的总时间,因为有些比较大会超过100000,建议用个比例来进行拖动,但这样要考虑到拖放播放的声音可能有一点回播现象

热点排行