简单音乐播放器的设计与实现
本文将介绍如何在Andriod Studio设计制作一个简单音乐播放器
功能说明
第二次安卓开发,所以要求相对上次而言难度稍微加大了一点。该程序实现的主要功能有上一曲,下一曲,播放,暂停,退出,进度条拖拽实现音乐播放进度调整。
分析
所需工具
Android Studio
设计思路
1.首先,我们设计一个音乐播放器的大致布局如下,大概有五个button,上一曲,下一曲,暂停,播放,退出(因为只做一个项目演示,重在功能,所以在这里我个人比较懒,没有调样式);然后有一个imageview用来存放每一个歌曲对应的背景图片,有三个textview分别用来存放一些必须的歌曲信息以及说明文字,一个textview用来写描述文字为当前进度,然后一个textview用来存储歌曲名,一个在图片顶部,用来展示歌曲名字,另外一个用来现实当前播放进度,大概布局效果如下:(详细设计代码在文末代码仓库链接中,此处不做赘述)
界面布局文件效果展示 |
2.创建一个文件夹raw文件夹,里面用来存放歌曲,以便程序能够更方便的访问到。
3.在drawable文件夹中,粘贴需要用到的对应歌曲的图标,或者背景图片。
4.在项目包中new一个Service类,在里面重写父类Service的一些重要方法,启动之后长时间工作在后台,配合Activity的调用来控制音乐播放的播放,暂停,进度条控制播放进度等行为。主要控制代码如下:(完整代码底部代码仓库有显示)
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
//用来对传递过来的消息类型做一个判断,然后对于指定的类型做指定的工作
switch (intent.getIntExtra("type",-1)){
//播放
case 1:
mediaPlayer.start();
break;
//暂停
case 2:
mediaPlayer.pause();
break;
case 3:
//先重置播放器,然后设置下一首歌曲,这里采取循环加1的方式
mediaPlayer.reset();
now=(++now)%musicid.length;
mediaPlayer=MediaPlayer.create(getApplicationContext(),musicid[now]);
mediaPlayer.start();
break;
//先重置播放器,然后设置上一首歌曲,这里采取循环减1的方式
case 4:
mediaPlayer.reset();
now=(--now)%musicid.length;
mediaPlayer=MediaPlayer.create(getApplicationContext(),musicid[now]);
mediaPlayer.start();
break;
}
return START_STICKY;
}
5.在MainActivity里面编写代码,(由于代码仓库有完整的代码,所以在下面我只介绍一些关键代码。)用来控制整个程序的运行。
首先定义一个内部类MyServiceConnection实现默认的ServiceConnection,然后在方法中实现myBinder用来获取当前Service对象
class MyServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//初始化myBinder
myBinder=(MyService1.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
本程序中要实现歌曲播放的时候实时更新进度条,必须定义一个线程用来控制进度条的更新,Thread.sleep(1000);用来设置线程睡眠1s(1秒更新执行一次后续代码,即传递消息,以便实现进度条实时更新)代码如下:
class MyThread1 extends Thread {
public void run() {
while (true) {
try {
Thread.sleep(1000);
Message msg = new Message();
msg.what = 0x123;
handler.sendMessage(msg);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public Handler handler=new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
if(msg.what==0x123){
// MyService1.MyBinder myBinder1=(MyService1.MyBinder) myBinder;
duration=myBinder.getMyService().Duration();
currentPosition=myBinder.getMyService().CurrentPosition();
int musicimage=myBinder.getMyService().getNowImage();
String musicname=myBinder.getMyService().getNowName();
//更新进度条和text1的内容
Update(currentPosition,duration);
//静态方法只执行一次
init(musicimage,musicname);
}
}
};
给seekBar设置一个setOnSeekBarChangeListener用来控制,实现拖动进度条调整播放进度,加上一个if(formUser)十分关键,用来判断是否是用户操作,如果是就执行,亲测可以很好的解决拖动卡顿的问题,代码如下:
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//判断是不是用户操作,如果是就执行下列代码,可以很好的解决的卡顿问题
if(fromUser){
myBinder.getMyService().seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//根据拖动的进度改变音乐播放进度
int progress=seekBar.getProgress();//获取seekBar的进度
myBinder.getMyService().seekTo(progress);//改变播放进度
}
});
其它五个按钮的实现相对来说比较好实现(上一曲,下一曲,播放,暂停,退出),这里就不做赘述,以上就是全部对简单音乐播放器实现与开发的分析。如果还有什么疑问,可参照去下载文末所给的代码仓库下载并查看所有代码。如果还有疑问欢迎qq交流。
效果展示动态图 |