使用android studio制作一个类似网易云音乐的播放器并且包含详细代码
时间: 2023-12-31 12:17:52 浏览: 228
MyMusic.rar
很抱歉,我之前回答的没有提供详细的代码。以下是一个简单的示例代码,可以帮助您开始制作一个类似网易云音乐的播放器。由于篇幅限制,代码注释并不是很详细,但应该足够让您理解每个部分的功能。
1. 首先,您需要创建一个新的Android项目,并将以下依赖项添加到build.gradle文件中:
```
implementation 'com.google.android.material:material:1.2.0'
implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation 'com.devbrackets.android:exomedia:4.3.0'
```
2. 在布局文件中添加以下控件:
```
<com.devbrackets.android.exomedia.ui.widget.VideoView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:useDefaultControls="false" />
<Button
android:id="@+id/play_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Play" />
<Button
android:id="@+id/pause_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pause" />
<SeekBar
android:id="@+id/seek_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="0" />
<TextView
android:id="@+id/current_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0:00" />
<TextView
android:id="@+id/total_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0:00" />
<SeekBar
android:id="@+id/volume_seek_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="70" />
```
3. 在MainActivity中添加以下代码:
```
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.devbrackets.android.exomedia.listener.OnCompletionListener;
import com.devbrackets.android.exomedia.listener.OnPreparedListener;
import com.devbrackets.android.exomedia.ui.widget.VideoView;
import com.google.android.material.snackbar.Snackbar;
import java.util.concurrent.TimeUnit;
public class MainActivity extends AppCompatActivity implements OnPreparedListener, OnCompletionListener {
private VideoView videoView;
private Button playButton;
private Button pauseButton;
private SeekBar seekBar;
private TextView currentTime;
private TextView totalTime;
private SeekBar volumeSeekBar;
private boolean isPlaying = false;
private int currentVolume = 70;
private int currentProgress = 0;
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
updateSeekBar();
return true;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView = findViewById(R.id.video_view);
playButton = findViewById(R.id.play_button);
pauseButton = findViewById(R.id.pause_button);
seekBar = findViewById(R.id.seek_bar);
currentTime = findViewById(R.id.current_time);
totalTime = findViewById(R.id.total_time);
volumeSeekBar = findViewById(R.id.volume_seek_bar);
// 设置VideoView准备监听器
videoView.setOnPreparedListener(this);
// 设置VideoView完成监听器
videoView.setOnCompletionListener(this);
// 设置播放按钮点击事件
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isPlaying) {
pause();
} else {
play();
}
}
});
// 设置暂停按钮点击事件
pauseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pause();
}
});
// 设置进度条拖动事件
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
currentProgress = progress;
updateCurrentTime();
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Do nothing
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
videoView.seekTo((int) (((double) currentProgress / 100.0) * videoView.getDuration()));
}
});
// 设置音量控制滑块拖动事件
volumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
currentVolume = progress;
videoView.setVolume(currentVolume);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Do nothing
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Do nothing
}
});
}
@Override
public void onPrepared() {
// 更新总时间
totalTime.setText(formatTime(videoView.getDuration()));
// 更新SeekBar
updateSeekBar();
}
@Override
public void onCompletion() {
// 播放完毕时,重置播放按钮状态为停止状态
isPlaying = false;
playButton.setText("Play");
// 显示Snackbar提示
Snackbar.make(findViewById(android.R.id.content), "Video completed", Snackbar.LENGTH_LONG).show();
}
private void play() {
// 开始播放
videoView.start();
isPlaying = true;
// 更新播放按钮状态
playButton.setText("Pause");
}
private void pause() {
// 暂停播放
videoView.pause();
isPlaying = false;
// 更新播放按钮状态
playButton.setText("Play");
}
private void updateSeekBar() {
// 更新SeekBar和当前时间文本框
seekBar.setProgress((int) (((double) videoView.getCurrentPosition() / (double) videoView.getDuration()) * 100.0));
updateCurrentTime();
// 发送延迟消息,以便每秒更新SeekBar和当前时间文本框
handler.sendEmptyMessageDelayed(0, TimeUnit.SECONDS.toMillis(1));
}
private void updateCurrentTime() {
// 更新当前时间文本框
currentTime.setText(formatTime((int) (((double) currentProgress / 100.0) * videoView.getDuration())));
}
private String formatTime(int timeMillis) {
// 将时间格式化为mm:ss
return String.format("%d:%02d",
TimeUnit.MILLISECONDS.toMinutes(timeMillis),
TimeUnit.MILLISECONDS.toSeconds(timeMillis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeMillis))
);
}
}
```
希望这份代码能够帮助您制作一个类似网易云音乐的播放器。如果您有任何疑问,请随时向我提问。
阅读全文