实战演练——音乐播放器
修改例3-2,加入进度条(SeekBar)功能和退出(Quit)功能。修改后的音乐播放器界面如图所示。功能如下:
(1)播放/暂停、停止、退出功能;
(2)进度条显示播放进度,拖动进度条可改变播放进度。
运行演示:
提示:进度条(SeekBar)功能的实现。
SeekBar的功能包括显示歌曲播放进度,以及拖动SeekBar至任意位置来改变播放进度,由于Android已经封装好了这些函数,所以直接调用就行,具体实现如下:
添加成员变量:SeekBar seekBar; MediaPlayer mediaPlayer; boolean isSeekBarChanging;
然后在onCreate()方法中加入进度条(SeekBar)的功能。
seekBar = (SeekBar) findViewById(R.id.seekBar);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
seekBar.setMax(mp.getDuration());
int m=mp.getDuration()/1000/60; //分
int s=mp.getDuration()/1000%60; //秒
txt2.setText("0"+m+":"+s);
}
});
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
isSeekBarChanging = true;
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
isSeekBarChanging = false;
mediaPlayer.seekTo(seekBar.getProgress());
}
});
最后加入以下功能:媒体播放器处于播放状态时,使用一个Timer定时器对象实时获取音乐的播放进度,并刷新SeekBar的状态。
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if (!isSeekBarChanging){
seekBar.setProgress(mediaPlayer.getCurrentPosition());
}
}
},0,1000);
MusicActivity 部分参考代码如下:
//媒体播放器的同步监听 OnPreparedListener
class Medprepared implements MediaPlayer.OnPreparedListener{
@Override
public void onPrepared(MediaPlayer mp) {
seekbar.setMax(mp.getDuration());
int m = mp.getDuration()/1000/60;
int s = mp.getDuration()/1000%60;
txt2.setText("0"+m+":"+s);
}
}
//进度条监听 OnSeekBarChangeListener
class SeekBarChange implements SeekBar.OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
isSeekBarChanging = true;
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
isSeekBarChanging = false;
mediaPlayer.seekTo(seekBar.getProgress());
}
}
//播放
class mPlay implements View.OnClickListener {
@Override
public void onClick(View view) {
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
play.setText("pause");
Timer timer= new Timer();
TimerTask task= new TimerTask(){
@Override
public void run() {
seekbar.setProgress(mediaPlayer.getCurrentPosition());
}
};
timer.schedule(task,0,1000);
} else {
mediaPlayer.pause();
play.setText("play");
}
}
}

