Android url MP3实现播放,暂停,上一首,下一首,进度条,时间点。并实现进度条使用渐变色
时间: 2023-10-11 11:09:33 浏览: 179
要实现Android url MP3的播放、暂停、上一首、下一首、进度条、时间点等功能,可以使用MediaPlayer和SeekBar组件。具体实现步骤如下:
1. 在布局文件中添加MediaPlayer和SeekBar组件,并设置相关属性:
```xml
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:progressDrawable="@drawable/custom_seekbar"
android:thumb="@drawable/custom_seekbar_thumb" />
<ImageView
android:id="@+id/iv_play_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="20dp"
android:src="@drawable/ic_play_arrow" />
<ImageView
android:id="@+id/iv_prev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:padding="20dp"
android:src="@drawable/ic_skip_previous" />
<ImageView
android:id="@+id/iv_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:padding="20dp"
android:src="@drawable/ic_skip_next" />
```
其中,custom_seekbar和custom_seekbar_thumb是自定义的渐变色进度条和拇指图标,可以根据需要进行设置。
2. 在Activity中初始化MediaPlayer和SeekBar组件,并设置相关监听器:
```java
private MediaPlayer mediaPlayer;
private SeekBar seekBar;
private ImageView ivPlayPause, ivPrev, ivNext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mediaPlayer = new MediaPlayer();
seekBar = findViewById(R.id.seekBar);
ivPlayPause = findViewById(R.id.iv_play_pause);
ivPrev = findViewById(R.id.iv_prev);
ivNext = findViewById(R.id.iv_next);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// 设置进度条的最大值为音频文件的总长度
seekBar.setMax(mp.getDuration());
// 开始播放音频文件
mp.start();
// 更新进度条和时间点
updateSeekBar();
updateCurrentTime();
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// 播放完毕后自动播放下一首歌曲
playNext();
}
});
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
// 用户拖动进度条时改变音频文件的播放位置
mediaPlayer.seekTo(progress);
// 更新时间点
updateCurrentTime();
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// 用户开始拖动进度条时停止自动更新进度条和时间点
handler.removeCallbacks(updateSeekBarTask);
handler.removeCallbacks(updateCurrentTimeTask);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// 用户停止拖动进度条时重新开始自动更新进度条和时间点
updateSeekBar();
updateCurrentTime();
}
});
ivPlayPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()) {
// 如果正在播放音频文件则暂停
mediaPlayer.pause();
ivPlayPause.setImageResource(R.drawable.ic_play_arrow);
} else {
// 如果已经暂停则继续播放
mediaPlayer.start();
ivPlayPause.setImageResource(R.drawable.ic_pause);
}
}
});
ivPrev.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 播放上一首歌曲
playPrev();
}
});
ivNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 播放下一首歌曲
playNext();
}
});
}
```
其中,updateSeekBar和updateCurrentTime是分别用来更新进度条和时间点的方法,playPrev和playNext是分别用来播放上一首和下一首歌曲的方法。
3. 实现渐变色进度条和时间点的更新:
```java
private Handler handler = new Handler();
private Runnable updateSeekBarTask = new Runnable() {
@Override
public void run() {
// 更新进度条
seekBar.setProgress(mediaPlayer.getCurrentPosition());
// 每100毫秒更新一次进度条
handler.postDelayed(this, 100);
}
};
private Runnable updateCurrentTimeTask = new Runnable() {
@Override
public void run() {
// 更新时间点
tvCurrentTime.setText(formatTime(mediaPlayer.getCurrentPosition()));
tvTotalTime.setText(formatTime(mediaPlayer.getDuration()));
// 每1秒更新一次时间点
handler.postDelayed(this, 1000);
}
};
private void updateSeekBar() {
handler.postDelayed(updateSeekBarTask, 100);
}
private void updateCurrentTime() {
handler.postDelayed(updateCurrentTimeTask, 1000);
}
private String formatTime(int time) {
SimpleDateFormat formatter = new SimpleDateFormat("mm:ss");
return formatter.format(new Date(time));
}
```
其中,formatTime方法是用来格式化时间点的方法。
4. 实现播放上一首和下一首歌曲的方法:
```java
private List<String> musicList = new ArrayList<>();
private int currentMusicIndex = 0;
private void playPrev() {
if (currentMusicIndex > 0) {
// 如果当前不是第一首歌曲则播放上一首
currentMusicIndex--;
} else {
// 如果当前已经是第一首歌曲则播放最后一首
currentMusicIndex = musicList.size() - 1;
}
playMusic(musicList.get(currentMusicIndex));
}
private void playNext() {
if (currentMusicIndex < musicList.size() - 1) {
// 如果当前不是最后一首歌曲则播放下一首
currentMusicIndex++;
} else {
// 如果当前已经是最后一首歌曲则播放第一首
currentMusicIndex = 0;
}
playMusic(musicList.get(currentMusicIndex));
}
private void playMusic(String url) {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(url);
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
```
其中,musicList是用来存储音频文件的URL列表的,currentMusicIndex是当前播放的音频文件在列表中的索引。
5. 实现渐变色进度条和拇指图标的自定义样式:
```xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadiusRatio="3"
android:shape="ring"
android:thicknessRatio="10"
android:useLevel="false">
<size
android:height="20dp"
android:width="20dp" />
<gradient
android:centerColor="#FF4081"
android:centerX="0.5"
android:centerY="0.5"
android:endColor="#FF4081"
android:startColor="#FFC107"
android:type="sweep" />
</shape>
```
```xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:height="20dp"
android:width="20dp" />
<solid android:color="#FF4081" />
</shape>
```
这样,就可以实现Android url MP3的播放、暂停、上一首、下一首、进度条、时间点等功能,并且使用渐变色进度条进行显示。
阅读全文