音乐播放之进度条 - 自定义
音乐播放之进度条
?
[前提]
* 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,建议用个比例来进行拖动,但这样要考虑到拖放播放的声音可能有一点回播现象