浏览 14325 次
锁定老帖子 主题:音乐播放之进度条 - 自定义
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-11
音乐播放之进度条
[前提] * 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(){ @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub int 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 block e.printStackTrace(); } mHandle.sendEmptyMessage(0); } } }
5. emulator 运行截图:
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-11
马上添加进我之前写的player里进行尝试
但是发现拖动实现定点播放都没有问题 就是没有实时更新SEEKBAR 不知道是我添加错哪里了~ |
|
返回顶楼 | |
发表时间:2010-04-12
ucgfan 写道 马上添加进我之前写的player里进行尝试
但是发现拖动实现定点播放都没有问题 就是没有实时更新SEEKBAR 不知道是我添加错哪里了~ 可能是因为你没有启动DelayThread所致吧 你在Activity::onCreate() 最后加上如下代码: startProgressUpdate() |
|
返回顶楼 | |
发表时间:2010-04-12
恩,果然是没有启用的问题~
无限感谢~~自己做的player又完善了一点~~ |
|
返回顶楼 | |
发表时间:2010-09-06
定点播放可以用一种更简单的方式
把音乐的总时间设置成进度条的最大值 musicProgressBar.setMax(mp.getDuration()); 这样你在进度条上拖动的位置直接就可以定位到毫秒了 public void onStopTrackingTouch(SeekBar seekBar) { mp.seekTo(musicProgressBar.getProgress()); } 更新进度条也一样 直接把当前播放的时间定位到进度条就可以了 musicProgressBar.setProgress(mp.getCurrentPosition()); |
|
返回顶楼 | |
发表时间:2010-09-06
建议不要用音乐的总时间,因为有些比较大会超过100000,建议用个比例来进行拖动,但这样要考虑到拖放播放的声音可能有一点回播现象
|
|
返回顶楼 | |