android播放⾳乐-进度条
今天学渣研究了⼀下使⽤MediaPlayer播放⾳乐时加⼊进度条,进度条如今⽤的是android⾃带的seekbar,后期会跟换UI的,在之前可以播放⾳乐的基础上,如今加⼊的主要功能有两个:
1实时显⽰播放进度
2⼿动调节播放进度
如今学渣新建了⼀个项⽬来进⾏測试,后期会和之前博客介绍的滑动页⾯进⾏整合,预计会在service建好后整合,敬请期待。。。。
好了先上效果图:
关于使⽤进度条的基本原理⾮常easy,⽤到了⼏个參数:
1 歌曲的时长:单位为毫秒,MediaPlayer的getDuration(),只是要注意getDuration()的使⽤状态,在这篇中介绍了MediaPlayer的各个状态,⼤家能够去看看。
2 进度条的长度:android⾥进度条的长度默认应该是100,单位不详,没影响
3 当前进度:对于歌曲⽽⾔,当前进度是当前播放的歌曲所在位置,单位毫秒,对于进度条⽽⾔,是在进度条中所占的⽐例。主要是对这两个进⾏转化。
两个功能:
1因为进度须要实时更新,因此在系统中⽤⼀个线程对UI线程发消息(每隔100毫秒),在UI线程中⽤Handler捕获消息,通过MediaPlayer的getCurrentPosition得到当前位置,进⽽计算seekbar相应的位置,对seekbar及时进⾏更新。
2对于⼿动调节歌曲进度时,通过获取调节到的位置,通过SeekBar.OnSeekBarChangeListener()监听滑动条,当滑动条调节位置确定后,通过onStopTrackingTouch()及时更新歌曲的进度,⽤MediaPlayer的seekTo(单位是毫秒)调节歌曲的进度。
详细代码例如以下:
public class MainActivity extends Activity {
MediaPlayer mediaPlayer;
SeekBar seekBar;
//本地歌曲的路径
String path = "/storage/sdcard1/Music/浪漫满屋.mp3";
//处理进度条更新
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
switch (msg.what){
case 0:
//更新进度
int position = CurrentPosition();
int time = Duration();
int max = Max();
seekBar.setProgress(position*max/time);
break;
default:
break;
}
}
};
@Override
石家庄之歌 杨辉protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
//初始化播放button
you jumpButton playButton = (Button)findViewById(R.id.playButton);
playButton.setOnClickListener(new OnClickListener(){说了再见
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "time is "+Duration(), 1000).show();    play();
}
});
//初始化暂停button
Button pauseButton = (Button)findViewById(R.id.pauseButton);
pauseButton.setOnClickListener(new OnClickListener(){
@Override
韩东旭public void onClick(View arg0) {
// TODO Auto-generated method stub
pause();
}
});
seekBar = (SeekBar)findViewById(R.id.seekbar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//⼿动调节进度
// TODO Auto-generated method stub
int dest = Progress();
int time = Duration();
int max = Max();
mediaPlayer.seekTo(time*dest/max);
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
// TODO Auto-generated method stub
}
});
}
//初始化⾳乐播放
void init(){
//进⼊Idle
mediaPlayer = new MediaPlayer();
try {
//初始化
mediaPlayer.setDataSource(path);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
// prepare 通过异步的⽅式装载媒体资源
mediaPlayer.prepareAsync();
//后台线程发送消息进⾏更新进度条
final int milliseconds = 100;
new Thread(){
@Override
public void run(){
while(true){
try {
sleep(milliseconds);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mHandler.sendEmptyMessage(0);
}
}
}.start();
} catch (Exception e) {michael jackson billie jean
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//測试播放⾳乐
void play(){
mediaPlayer.start();
}
//暂停⾳乐
private void pause() {
民歌精选
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
//activity 退出时,停⽌播放⾳乐,释放资源
@Override
protected void onDestroy() {
// 在activity结束的时候回收资源
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer = null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.  getMenuInflater().u.main, menu);
return true;
}
}