蓝桉云顶

Good Luck To You!

如何在Android中实现音乐播放器的进度条效果?

在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实现音乐播放器进度条效果”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年11月    »
123
45678910
11121314151617
18192021222324
252627282930
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接