在android中实现音乐播放器进度条效果,可以使用seekbar组件来表示播放进度,通过更新seekbar的progress值来显示当前播放位置。
Android实现音乐播放器进度条效果
使用MediaPlayer实现Android的音乐播放器,能够播放、暂停、停止歌曲;同时使用SeekBar来控制音乐的播放进度,可以通过调节SeekBar的进度来控制播放进度,本文将详细介绍如何实现这一功能,包括布局文件的修改、关键代码的编写以及一些注意事项。
1. 布局文件activity_main.xml
我们需要在布局文件中添加一个SeekBar和两个TextView,用于显示当前播放时间和总时长,以下是修改后的布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_margin="20dp" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_marginTop="20dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/music_name" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <SeekBar android:id="@+id/seekBar" android:layout_marginTop="80dp" android:layout_width="match_parent" android:layout_height="wrap_content"/> <LinearLayout android:layout_below="@id/seekBar" android:layout_alignEnd="@id/seekBar" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/music_cur" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="/"/> <TextView android:id="@+id/music_length" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </RelativeLayout> </LinearLayout> <LinearLayout android:gravity="center" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageButton android:id="@+id/play" android:src="@mipmap/bofang" android:background="@null" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <ImageButton android:id="@+id/pause" android:src="@mipmap/pause" android:background="@null" android:layout_marginLeft="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <ImageButton android:id="@+id/stop" android:src="@mipmap/stop" android:background="@null" android:layout_marginLeft="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </RelativeLayout>
Activity实现代码
我们需要在Activity中实现对SeekBar的控制,包括播放、暂停、停止以及拖动SeekBar更新播放进度的功能,以下是完整的实现代码:
import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; import android.widget.ImageButton; import android.widget.SeekBar; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class MediaActivity extends AppCompatActivity { private MediaPlayer mediaPlayer;//媒体播放器 private SeekBar seekBar;//进度条 private TextView musicCur, musicLength;//当前播放时间和总时长显示 private ImageButton playBtn, pauseBtn, stopBtn;//播放、暂停、停止按钮 private Handler handler = new Handler();//定时器,时时更新进度条 private boolean isCellPlay;//互斥变量,防止进度条与定时器冲突。 private int currentPosition;//当前音乐播放的进度 private static final String TAG = "MediaActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化媒体播放器 mediaPlayer = new MediaPlayer(); //初始化控件 seekBar = findViewById(R.id.seekBar); musicCur = findViewById(R.id.music_cur); musicLength = findViewById(R.id.music_length); playBtn = findViewById(R.id.play); pauseBtn = findViewById(R.id.pause); stopBtn = findViewById(R.id.stop); //设置SeekBar的最大值 seekBar.setMax(mediaPlayer.getDuration()); //监听滚动条事件 seekBar.setOnSeekBarChangeListener(new MySeekBar()); //监听[播放或暂停]事件 playBtn.setOnClickListener(new PlayListener()); //监听[暂停]事件 pauseBtn.setOnClickListener(new PauseListener()); //监听[停止]事件 stopBtn.setOnClickListener(new StopListener()); } //播放或暂停事件处理 private class PlayListener implements View.OnClickListener { @Override public void onClick(View v) { if (!isCellPlay) { mediaPlayer.start(); playBtn.setImageResource(R.mipmap.pause); isCellPlay = true; } else { mediaPlayer.pause(); playBtn.setImageResource(R.mipmap.bofang); isCellPlay = false; } } } //暂停事件处理 private class PauseListener implements View.OnClickListener { @Override public void onClick(View v) { if (isCellPlay) { mediaPlayer.pause(); playBtn.setImageResource(R.mipmap.bofang); isCellPlay = false; } else { mediaPlayer.start(); playBtn.setImageResource(R.mipmap.pause); isCellPlay = true; } } } //停止事件处理 private class StopListener implements View.OnClickListener { @Override public void onClick(View v) { mediaPlayer.stop(); mediaPlayer.reset(); playBtn.setImageResource(R.mipmap.bofang); isCellPlay = false; } } //SeekBar事件处理 private class MySeekBar implements SeekBar.OnSeekBarChangeListener { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { mediaPlayer.seekTo(progress);//根据进度条的位置调整播放进度 currentPosition = progress;//记录当前播放位置 } else { currentPosition = mediaPlayer.getCurrentPosition();//获取当前播放位置 } updateTime(currentPosition, mediaPlayer.getDuration());//更新时间显示 } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } } //更新时间显示的方法 private void updateTime(int currentPosition, int duration) { musicCur.setText(formatTime(currentPosition));//更新当前播放时间显示 musicLength.setText(formatTime(duration));//更新总时长显示 } //格式化时间的方法,将毫秒转换为分钟:秒的形式显示 private String formatTime(int milliseconds) { int minute = milliseconds / 60000;//计算分钟数 int second = (milliseconds % 60000) / 1000;//计算秒数 return minute + ":" + second;//返回格式化后的时间字符串 } @Override protected void onDestroy() { super.onDestroy(); mediaPlayer.release();//释放资源 handler.removeCallbacksAndMessages(null);//移除所有回调和消息,防止内存泄漏
各位小伙伴们,我刚刚为大家分享了有关“android实现音乐播放器进度条效果”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!