android studio期末大作业制作一个高级的·音乐播放器包含源代码
时间: 2023-11-06 21:06:16 浏览: 80
很好,制作一个高级的音乐播放器是一个很好的项目。以下是一个简单的实现,您可以在此基础上进行扩展和改进。以下是一个使用Android Studio开发的音乐播放器的示例代码。
首先,您需要在XML布局文件中定义UI元素,如下所示:
```xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/layout_music_controls"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#000000">
<ImageButton
android:id="@+id/btn_previous"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="@null"
android:src="@drawable/ic_previous" />
<ImageButton
android:id="@+id/btn_play_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="@null"
android:src="@drawable/ic_play" />
<ImageButton
android:id="@+id/btn_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="@null"
android:src="@drawable/ic_next" />
<SeekBar
android:id="@+id/seek_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingLeft="10dp"
android:paddingRight="10dp" />
<TextView
android:id="@+id/text_view_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:text="00:00" />
</LinearLayout>
<ListView
android:id="@+id/list_view_songs"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/layout_music_controls" />
</RelativeLayout>
```
接下来,您需要为这些UI元素创建适当的变量。
```java
public class MainActivity extends AppCompatActivity implements MediaPlayer.OnCompletionListener {
private ListView listViewSongs;
private ImageButton btnPrevious, btnPlayPause, btnNext;
private SeekBar seekBar;
private TextView textViewDuration;
private MediaPlayer mediaPlayer;
private SongAdapter songAdapter;
private Handler mHandler = new Handler();
private List<Song> songs;
private int currentSongIndex = 0;
private boolean isPaused = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listViewSongs = (ListView) findViewById(R.id.list_view_songs);
btnPrevious = (ImageButton) findViewById(R.id.btn_previous);
btnPlayPause = (ImageButton) findViewById(R.id.btn_play_pause);
btnNext = (ImageButton) findViewById(R.id.btn_next);
seekBar = (SeekBar) findViewById(R.id.seek_bar);
textViewDuration = (TextView) findViewById(R.id.text_view_duration);
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnCompletionListener(this);
songs = new ArrayList<>();
songs.add(new Song("Song 1", R.raw.song1));
songs.add(new Song("Song 2", R.raw.song2));
songs.add(new Song("Song 3", R.raw.song3));
songs.add(new Song("Song 4", R.raw.song4));
songs.add(new Song("Song 5", R.raw.song5));
songAdapter = new SongAdapter(this, songs);
listViewSongs.setAdapter(songAdapter);
listViewSongs.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
currentSongIndex = position;
playSong();
}
});
btnPrevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (currentSongIndex > 0) {
currentSongIndex--;
} else {
currentSongIndex = songs.size() - 1;
}
playSong();
}
});
btnPlayPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
btnPlayPause.setImageResource(R.drawable.ic_play);
isPaused = true;
} else {
if (isPaused) {
mediaPlayer.start();
btnPlayPause.setImageResource(R.drawable.ic_pause);
} else {
playSong();
}
isPaused = false;
}
}
});
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (currentSongIndex < (songs.size() - 1)) {
currentSongIndex++;
} else {
currentSongIndex = 0;
}
playSong();
}
});
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
mediaPlayer.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
updateSeekBar();
}
private void playSong() {
try {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.reset();
Song song = songs.get(currentSongIndex);
mediaPlayer.setDataSource(getApplicationContext(), Uri.parse("android.resource://" + getPackageName() + "/" + song.getSongResource()));
mediaPlayer.prepare();
mediaPlayer.start();
btnPlayPause.setImageResource(R.drawable.ic_pause);
updateSeekBar();
} catch (IOException e) {
e.printStackTrace();
}
}
private void updateSeekBar() {
mHandler.postDelayed(mUpdateTimeTask, 100);
}
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
long totalDuration = mediaPlayer.getDuration();
long currentDuration = mediaPlayer.getCurrentPosition();
textViewDuration.setText(milliSecondsToTimer(currentDuration) + "/" + milliSecondsToTimer(totalDuration));
int progress = (int) (getProgressPercentage(currentDuration, totalDuration));
seekBar.setProgress(progress);
mHandler.postDelayed(this, 100);
}
};
private int getProgressPercentage(long currentDuration, long totalDuration) {
Double percentage = (double) 0;
long currentSeconds = (int) (currentDuration / 1000);
long totalSeconds = (int) (totalDuration / 1000);
percentage = (((double) currentSeconds) / totalSeconds) * 100;
return percentage.intValue();
}
private String milliSecondsToTimer(long milliseconds) {
String finalTimerString = "";
String secondsString = "";
int hours = (int) (milliseconds / (1000 * 60 * 60));
int minutes = (int) (milliseconds % (1000 * 60 * 60)) / (1000 * 60);
int seconds = (int) ((milliseconds % (1000 * 60 * 60)) % (1000 * 60) / 1000);
if (hours > 0) {
finalTimerString = hours + ":";
}
if (seconds < 10) {
secondsString = "0" + seconds;
} else {
secondsString = "" + seconds;
}
finalTimerString = finalTimerString + minutes + ":" + secondsString;
return finalTimerString;
}
@Override
public void onCompletion(MediaPlayer mp) {
if (currentSongIndex < (songs.size() - 1)) {
currentSongIndex++;
playSong();
} else {
currentSongIndex = 0;
btnPlayPause.setImageResource(R.drawable.ic_play);
}
}
}
```
此代码中,我们定义了一些变量,例如列表视图,前进、播放/暂停和后退按钮,以及音乐播放器。我们还定义了一个适配器,以便将歌曲数据绑定到列表视图。
在onCreate方法中,我们初始化了音乐播放器和适配器,并设置了UI元素的监听器。我们还创建了一个Runnable来更新SeekBar,以便显示当前播放时间和歌曲的总时间。
在playSong方法中,我们使用MediaPlayer类播放所选歌曲,并更新SeekBar。
最后,我们实现了MediaPlayer.OnCompletionListener接口来处理歌曲播放结束时的情况。
这只是一个基本的示例代码,您可以根据需要对其进行扩展和改进。