编程一首MP3,并用进度条显示播放进度
时间: 2023-08-27 15:04:03 浏览: 90
以下是一个简单的Android MP3播放器的实现,同时使用Seekbar控件来显示播放进度。
在layout文件中添加一个SeekBar控件:
```xml
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:max="100"
android:progress="0" />
```
然后在Activity中实现MP3播放器的控制和进度条更新:
```java
public class MainActivity extends AppCompatActivity implements MediaPlayer.OnCompletionListener {
private MediaPlayer mediaPlayer;
private SeekBar seekBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mediaPlayer = MediaPlayer.create(this, R.raw.music);
mediaPlayer.setOnCompletionListener(this);
seekBar = findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
mediaPlayer.seekTo(progress * mediaPlayer.getDuration() / 100);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
public void play(View view) {
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
seekBar.setMax(mediaPlayer.getDuration());
new Thread(new Runnable() {
@Override
public void run() {
while (mediaPlayer.isPlaying()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
seekBar.setProgress(mediaPlayer.getCurrentPosition());
}
});
}
}
}).start();
}
}
public void pause(View view) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
public void stop(View view) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer = MediaPlayer.create(this, R.raw.music);
mediaPlayer.setOnCompletionListener(this);
seekBar.setProgress(0);
}
}
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer = MediaPlayer.create(this, R.raw.music);
mediaPlayer.setOnCompletionListener(this);
seekBar.setProgress(0);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}
}
```
在这个例子中,我们首先在onCreate()方法中创建MediaPlayer对象,并设置OnCompletionListener监听器,以便在播放完成时重新创建MediaPlayer对象。
然后在play()方法中调用MediaPlayer的start()方法开始播放MP3,并启动一个新的线程来更新SeekBar的进度条。在SeekBar的OnSeekBarChangeListener监听器中,我们实现了当用户拖动SeekBar时,MediaPlayer会跳到相应的位置。
在pause()方法中,我们调用MediaPlayer的pause()方法暂停播放,而在stop()方法中,我们调用MediaPlayer的stop()方法停止播放,并在播放完成时调用OnCompletionListener中的方法重新创建MediaPlayer对象。
最后,在onDestroy()方法中释放MediaPlayer对象的资源。
需要注意的是,在更新SeekBar的进度条时,我们需要使用runOnUiThread方法来更新UI线程中的SeekBar控件。
阅读全文