Android本地及网络音乐播放器-播放界面显示(二)

本文介绍了一个音乐播放器界面的设计方案,包括主界面音乐图标点击监听功能,通过Intent实现不同界面间的通信,以及音乐播放进度的实时更新。还详细展示了如何使用SeekBar组件控制音乐播放进度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接着上一篇的继续,该节讲的是实现一个音乐播放的界面,毕竟直接在主界面播放音乐无法看到细节,也不够美观;这里我们在主界面右下角的音乐图标上添加点击监听,点击即可转到播放音乐界面,具体代码如下:(整个项目源码下载链接在文章末尾)
音乐播放界面
1.MainActivity做如下修改:

    //音乐控制按钮的监听
    private class MyPlayListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            int id = v.getId();
            switch (id) {
            case R.id.pre:
                pre();
                break;
            case R.id.playandpause:
                if (isPlaying) {
                    pause();
                } else {
                    play();
                }
                break;
            case R.id.next:
                next();
                break;
            case R.id.playarea:
                switchToPlayActivity();//添加转到播放界面的监听
                break;
            default:
                break;
            }
        }       
    }

    public void switchToPlayActivity() {
        Log.d("MainActivity", "switchToPlayActivity");
        Intent intent = new Intent(this, PlayActivity.class);
        startActivity(intent);
    }

//通信后台MusicService更新播放信息
    public void notifyPlayService() {
        //...
        refreshPlayState();
        notifyPlayActivity();//每次播放状态改变通知播放界面
    }

2.MusicService作如下修改

//继续播放
    private void continuePlaying() {
        Log.d("MusicService", "continuePlaying");
        musicPlayer.start();
        timer.cancel();//timer定时给播放界面发送当前播放时间和进度
        timer = new Timer();    
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                if (musicPlayer != null && musicPlayer.isPlaying()) {
                    int playedTime = musicPlayer.getCurrentPosition();
                    int duration = musicPlayer.getDuration();
                    Intent updateIntent = new Intent();
                    updateIntent.putExtra("playedTime", playedTime);
                    updateIntent.putExtra("duration", duration);
                    updateIntent.putExtra("progrees", playedTime/duration);
                    updateIntent.setAction("action.updateplayedtime");
                    MusicService.this.sendBroadcast(updateIntent);
                }               
            }           
        }, 0, 1000);
    }
    //从头开始播放一首歌
    private  void play() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (musicPlayer.isPlaying()) {
                    musicPlayer.stop();
                }
                try {
                    musicPosition = 0;
                    musicPlayer.reset();
                    musicPlayer.setDataSource(MainActivity.currentMusicUrl);
                    musicPlayer.prepare();
                    musicPlayer.start();
                    //播放完成发送播放下一首的广播请求
                    musicPlayer.setOnCompletionListener(new OnCompletionListener() {

                        @Override
                        public void onCompletion(MediaPlayer arg0) {
                            Intent completeIntent = new Intent();
                            completeIntent.setAction("action.nextsong");  
                            sendBroadcast(completeIntent);
                            Log.d("MusicService", "sendBroadcast");
                        }               
                    });     
                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(MusicService.this, "加载音乐失败,请检查网络链接!",500).show();
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }

        }).start();
        timer.cancel();//timer定时给播放界面发送当前播放时间和进度
        timer = new Timer();    
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                if (musicPlayer != null && musicPlayer.isPlaying()) {
                    int playedTime = musicPlayer.getCurrentPosition();
                    int duration = musicPlayer.getDuration();
                    Intent updateIntent = new Intent();
                    updateIntent.putExtra("playedTime", playedTime);
                    updateIntent.putExtra("duration", duration);
                    updateIntent.putExtra("progrees", playedTime/duration);
                    updateIntent.setAction("action.updateplayedtime");
                    MusicService.this.sendBroadcast(updateIntent);
                }               
            }           
        }, 0, 200);

    }

private BroadcastReceiver updateReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();  
             if (action.equals("action.changesong")) {
                  prepareMusic(intent);
             } else if (action.equals("action.newProgress")) {//接收到手动拖动进度条广播后改变音乐播放进度
                 int newProgress = intent.getIntExtra("newProgress", 0);
                    int time = newProgress * musicPlayer.getDuration() / 100;
                    musicPlayer.seekTo(time);
             }
        }

    };

@Override
    public void onCreate() {
        super.onCreate();
        Log.d("MusicService", "_onCreate");
        IntentFilter intentFilter = new IntentFilter();   
        intentFilter.addAction("action.changesong"); 
        intentFilter.addAction("action.newProgress"); 
        registerReceiver(updateReceiver, intentFilter);
        timer = new Timer();
    }

3.添加PlayActivity

package com.example.comfortmusic_1;


import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.json.JSONObject;


import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;

import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;

import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;

import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

public class PlayActivity extends Activity {

    private TextView lrc;
    private TextView title;//歌曲名
    private TextView artist;//演唱者
    private TextView playedTime;//已播放时长
    private TextView duration;//整首歌时长
    private ImageView lrcPic;//专辑图标
    private SeekBar seekBar;//播放进度条
    private Animation lrcAnimation;//专辑图标旋转动画
    //音乐控制UI
    private ImageView pre;
    private ImageView playOrPause;
    private ImageView next;
    private ImageView cycleView;
    private MusicOnClickListener listener;

    private boolean changeSong;
    private int progress;
    public static int playedMusicTime;
    protected static final String TAG = "PlayActivity";

    Handler handler;

    public static boolean changeProgress;
    public double deltaY;
    public int durationMusic;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.play);
Toast.makeText(PlayActivity.this, "PlayActivity_onCreate", 300).show();
        init();
        IntentFilter intentFilter = new IntentFilter();  
        intentFilter.addAction("action.updateplayedtime");  
        intentFilter.addAction("action.notifyPlayActivity");
        registerReceiver(updateReceiver, intentFilter);
    }

    private void init() {
        lrc = (TextView) findViewById(R.id.lrc);
        lrcPic = (ImageView) findViewById(R.id.lrcpic);
        lrcAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate);
        lrcPic.startAnimation(lrcAnimation);
        listener = new MusicOnClickListener();
        title = (TextView) findViewById(R.id.title1);
        artist = (TextView) findViewById(R.id.artist1);
        playedTime = (TextView) findViewById(R.id.playedtime);
        playedTime.setText("00:00");
        duration = (TextView) findViewById(R.id.duration1);
        seekBar = (SeekBar) findViewById(R.id.seekBar1);
        pre = (ImageView) findViewById(R.id.pre1);
        playOrPause = (ImageView) findViewById(R.id.playorpause1);
//      playOrPause.setImageResource(R.drawable.play);
        next = (ImageView) findViewById(R.id.next1);
        cycleView = (ImageView) findViewById(R.id.cycleview);
        pre.setOnClickListener(listener);
        cycleView.setOnClickListener(listener);
        lrcPic.setOnClickListener(listener);
        lrc.setOnClickListener(listener);
        playOrPause.setOnClickListener(listener);
        next.setOnClickListener(listener);
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
//              Log.d(TAG, "onStopTrackingTouch");
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
 //              Log.d(TAG, "onStartTrackingTouch");
            }

            @Override
            public void onProgressChanged(SeekBar seekBar, int newProgress,boolean fromUser) {//手动改变进度条时改变音乐播放进度
 //             Log.d(TAG, "onProgressChanged");
                if (Math.abs(newProgress - progress) < 2) {
                    return;
                }
                changeProgress = true;
                PlayActivity.playedMusicTime = newProgress * durationMusic/100;
                seekBar.setProgress(newProgress);
                Intent intent = new Intent();
                intent.putExtra("newProgress", newProgress);
                intent.setAction("action.newProgress");
                PlayActivity.this.sendBroadcast(intent);
            }
        });

        getData();
        updatePlayingUI();

    }
    //初始化UI
    private void getData() {
        title.setText(MainActivity.currentMusicTitle);
        artist.setText(MainActivity.currentMusicArtist);
        duration.setText(MainActivity.currentMusicDuration);
        updatePlayingUI();
    }

    //跟新UI状态
    private void updatePlayingUI() {
        if (MainActivity.isPlaying ) {
            lrc.setVisibility(View.VISIBLE);
            lrcPic.startAnimation(lrcAnimation);
            playOrPause.setImageResource(R.drawable.pause);
        } else {
            lrcPic.clearAnimation();
            playOrPause.setImageResource(R.drawable.play);
        }
    }


    @Override
    protected void onDestroy() {
        this.unregisterReceiver(updateReceiver);
        super.onDestroy();
    }

    private class MusicOnClickListener implements OnClickListener {

        @Override
        public void onClick(View source) {
            Intent intent = new Intent();
            switch (source.getId()) {
            case R.id.pre1: //上一首
                seekBar.setProgress(0);
                playedTime.setText("00:00");
                intent.setAction("action.pre");
                sendGB(intent);
                break;
            case R.id.playorpause1://播放/暂停
                if (MainActivity.isPlaying) {
                    MainActivity.isPlaying = false;
                    updatePlayingUI();
                    intent.setAction("action.pause");
                    sendGB(intent);
                } else {
                    MainActivity.isPlaying = true;
                    updatePlayingUI();
                    intent.setAction("action.play");
                    sendGB(intent);
                }
                break;
            case R.id.next1://下一首
                seekBar.setProgress(0);
                playedTime.setText("00:00");                
                intent.setAction("action.next");
                sendGB(intent);
                break;
            case R.id.cycleview://改变循环模式

                if (MainActivity.CYCLE == MainActivity.CYCLE_LIST) {
                    MainActivity.CYCLE = MainActivity.CYCLE_RANDOM;
                    cycleView.setImageResource(R.drawable.play_random);
Toast.makeText(PlayActivity.this, "随机循环", 300).show();
                } else if (MainActivity.CYCLE == MainActivity.CYCLE_RANDOM) {
                    cycleView.setImageResource(R.drawable.play_repeat_one);
                    MainActivity.CYCLE = MainActivity.CYCLE_SINGLE;
Toast.makeText(PlayActivity.this, "单曲循环", 300).show();
                } else if (MainActivity.CYCLE == MainActivity.CYCLE_SINGLE) {
                    cycleView.setImageResource(R.drawable.play_list);
                    MainActivity.CYCLE = MainActivity.CYCLE_LIST;
Toast.makeText(PlayActivity.this, "列表循环", 300).show();
                updatePlayingUI();
                }
                break;
            case R.id.lrcpic:
                break;
            case R.id.lrc:
                Log.d(TAG, "click lrc");
                break;
            case R.id.lrc1:
                break;
            default:
                break;

            }
        }

    }

    private void sendGB(Intent intent) {
//      Toast.makeText(PlayActivity.this, "sendBroadcast-action:"+ intent.getAction(), 300).show();
        PlayActivity.this.sendBroadcast(intent);
    }   


    private BroadcastReceiver updateReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();  
            if (action.equals("action.updateplayedtime"))  //更新播放时间-进度条
              {  
                progress = intent.getIntExtra("progress", 0);
                playedMusicTime = intent.getIntExtra("playedTime", 0);
                if (changeSong) {
                    playedTime.setText("00:00");
                } else {
                    playedTime.setText(formatTime(playedMusicTime));
                }

                durationMusic = intent.getIntExtra("duration", 0);
                progress = playedMusicTime*100/durationMusic;

                seekBar.setProgress(progress);              
              } else if (action.equals("action.notifyPlayActivity")) {//更新播放信息              
                  title.setText(MainActivity.currentMusicTitle);
                  artist.setText(MainActivity.currentMusicArtist);
                  duration.setText(MainActivity.currentMusicDuration);
                  if (MainActivity.isPlaying) {
                    playOrPause.setImageResource(R.drawable.pause);
                } else {
                    playOrPause.setImageResource(R.drawable.play);
                }
              }  else if (action.equals("action.destroy")) {
                  PlayActivity.this.onDestroy();
              }
        }

    };

    //转换方法,将毫秒单位的时长转换成时间格式00:00
    protected String formatTime(int time) {
        int allsecond = time / 1000;
        String minute = allsecond / 60 + "";
        if (minute.length() < 2) {minute = "0" + minute;}
        String second = allsecond % 60 + "";
        if (second.length() < 2) {second = "0" + second;}
        return minute + ":" +second;
    }   

    @Override
    protected void onResume() {

        if (MainActivity.CYCLE == MainActivity.CYCLE_LIST) {
            cycleView.setImageResource(R.drawable.play_list);
//Toast.makeText(PlayActivity.this, "列表循环", 200).show();
        } else if (MainActivity.CYCLE == MainActivity.CYCLE_RANDOM) {
            cycleView.setImageResource(R.drawable.play_random);
//Toast.makeText(PlayActivity.this, "随机循环", 200).show();
        } else if (MainActivity.CYCLE == MainActivity.CYCLE_SINGLE) {
            cycleView.setImageResource(R.drawable.play_repeat_one);
//Toast.makeText(PlayActivity.this, "单曲循环", 200).show();
        }
        super.onResume();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        return super.onKeyDown(keyCode, event);
    }

}

至此基本实现了音乐播放界面的展示,后期将继续拓展功能.
Android本地及网络音乐播放器源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值