业务流程分析说明
1.首先设置了布局文件和获取了各个视图组件的引用。还创建了一个 MediaPlayer 对象,初始化了歌曲列表和当前歌曲索引。
2.设置了播放按钮、上一曲按钮和下一曲按钮的点击事件监听器。
3.创建了一个定时任务 updateSeekBar(),使用 Handler 定时更新 SeekBar 的进度。
4.在播放/暂停按钮的点击事件监听器中,通过判断 MediaPlayer 是否正在播放来进行播放和暂停的切换,并相应地更新按钮的图标。
5.在上一曲和下一曲按钮的点击事件监听器中,通过调用 playPreviousSong() 和 playNextSong() 方法切换到上一首和下一首歌曲,并更新歌曲标题
6.在 SeekBar 的进度变化监听器中,当用户拖动进度条时,通过调用 mediaPlayer.seekTo() 方法来改变歌曲的播放位置。
功能核心技术
1.使用 MediaPlayer 类进行音乐播放,调用 MediaPlayer 的方法,可以实现音乐的播放、暂停、停止、切换等功能。
2.使用 SeekBar 控件实现进度条,通过设置 SeekBar 的最大值和进度,
3使用 postDelayed() 方法和 Runnable 接口,实现定时任务,用于更新进度条的显示。
4.使用集合存储歌曲列表,使用了 List<Song> 来存储歌曲列表。
功能模块说明与核心代码
1.使用 MediaPlayer 类进行音乐播放,调用 MediaPlayer 的方法,可以实现音乐的播放、暂停、停止、切换等功能。
// 初始化MediaPlayer
mediaPlayer = MediaPlayer.create(this, songList.get(currentSongIndex).getAudioResourceId());
// 设置按钮点击事件监听器
btnPrevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 实现上一曲功能
playPreviousSong();
}
});
btnPlayPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 实现播放/暂停功能
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
btnPlayPause.setImageResource(R.drawable.ic_play);
} else {
mediaPlayer.start();
btnPlayPause.setImageResource(R.drawable.ic_pause);
}
}
});
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 实现下一曲功能
playNextSong();
}
});
2.使用 SeekBar 控件实现进度条,通过设置 SeekBar 的最大值和进度,
// 设置SeekBar的最大值
seekBar.setMax(mediaPlayer.getDuration());
// 设置SeekBar的进度变化监听器
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
if (fromUser) {
mediaPlayer.seekTo(progress);
}
}
3使用 postDelayed() 方法和 Runnable 接口,实现定时任务,用于更新进度条的显示。
private void updateSeekBar() {
// 使用Handler定时更新SeekBar的进度
final android.os.Handler handler = new android.os.Handler();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (mediaPlayer != null) {
int currentPosition = mediaPlayer.getCurrentPosition();
seekBar.setProgress(currentPosition);
}
handler.postDelayed(this, 1000); // 1000毫秒即1秒更新一次
}
});
}
4.使用集合存储歌曲列表,使用了 List<Song> 来存储歌曲列表。
private static class Song {
private String songTitle;
private int audioResourceId;
private int coverResourceId;
public Song(String songTitle, int audioResourceId, int coverResourceId) {
this.songTitle = songTitle;
this.audioResourceId = audioResourceId;
this.coverResourceId = coverResourceId;
}
public int getAudioResourceId() {
return audioResourceId;
}
public String getSongTitle() {
return songTitle;
}
}
// 添加歌曲...
songList.add(new Song("黑夜问白天");
songList.add(new Song("传奇");
songList.add(new Song("青春修炼手册");
songList.add(new Song("他说");