`
gryphone
  • 浏览: 427179 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

阅读更多

音乐播放之进度条

 

[前提]

* 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 运行截图:

 

 

 

 

分享到:
评论
6 楼 ableouou 2010-09-06  
建议不要用音乐的总时间,因为有些比较大会超过100000,建议用个比例来进行拖动,但这样要考虑到拖放播放的声音可能有一点回播现象
5 楼 zhouxiaoli521 2010-09-06  
定点播放可以用一种更简单的方式
把音乐的总时间设置成进度条的最大值
musicProgressBar.setMax(mp.getDuration());

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

更新进度条也一样 直接把当前播放的时间定位到进度条就可以了
musicProgressBar.setProgress(mp.getCurrentPosition());
4 楼 lee306675730 2010-04-22  
學習了,最近正剛開始學習android,
看到你們好牛。。奮鬥啊!
3 楼 ucgfan 2010-04-12  
恩,果然是没有启用的问题~
无限感谢~~自己做的player又完善了一点~~
2 楼 gryphone 2010-04-12  
ucgfan 写道
马上添加进我之前写的player里进行尝试
但是发现拖动实现定点播放都没有问题
就是没有实时更新SEEKBAR
不知道是我添加错哪里了~

可能是因为你没有启动DelayThread所致吧 你在Activity::onCreate() 最后加上如下代码:
startProgressUpdate()

1 楼 ucgfan 2010-04-11  
马上添加进我之前写的player里进行尝试
但是发现拖动实现定点播放都没有问题
就是没有实时更新SEEKBAR
不知道是我添加错哪里了~

相关推荐

Global site tag (gtag.js) - Google Analytics