效果图:

思路整理:

1.要实现上、下曲切换,进度条正常播放前提首先要把音乐资源导入播放器中;
2.获取音乐的时间长度get.length
3.用seekbar获取进度条,使用线程的方法配置进度条
4.碟片合成,获取音乐的专辑封面,和黑色碟片图片进行合成

重难点:

使用Thread和SeekBar实现进度条

1.音乐资源导入播放器中,实现上、下曲播放

在实体类定义属性,public String path;

Music M = new Music();
M.path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));

在java代码中,需要调用try/catch方法获取资源,开始播放:

try {mediaPlayer.setDataSource(music.path);mediaPlayer.prepare();mediaPlayer.start();} catch (IOException e) {e.printStackTrace();}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.pre:i--;if (i==-1){i=Commom.musicList.size()-1;}play();break;case R.id.next:i++;if (i==Commom.musicList.size()){i=0;}play();break;case R.id.play:if (mediaPlayer.isPlaying()){mediaPlayer.pause();playBtn.setImageResource(R.mipmap.ic_play_btn_play_pressed);//暂停时的音乐图标}else {mediaPlayer.start();playBtn.setImageResource(R.mipmap.ic_play_btn_pause_pressed);//播放时的音乐图标}break;}}//退出当前页面时,停止播放音乐@Overrideprotected void onDestroy() {super.onDestroy();mediaPlayer.reset();isStop=true;}

2.获取音乐时长:

get.length获得音乐时长:

M.length = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));

进度条两边的time格式化一下

private String fromatTime(int length) {Date date=new Date(length);SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");String totaltime=sdf.format(date);return totaltime;}

3.用seekbar获取进度条,使用线程的方法配置进度条

在XML代码l:

        <SeekBar
            android:id="@+id/seekbar"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1" />

java代码:

//实现进度条快进后退,注意seekTo方法里的参数是毫秒
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {if (b){mediaPlayer.seekTo(i);}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});}

private  int totalTime;
//定义一个变量,用来接收音乐时长seekBar.setMax(music.length);//将音乐时长赋值给进度条totaltimetv.setText(fromatTime(music.length));totalTime=music.length;
//创建一个子线程,发送当前进度条位置
class MusicThread implements Runnable{@Overridepublic void run() {while (!isStop&&mediaPlayer!=null) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}handler.sendEmptyMessage(mediaPlayer.getCurrentPosition());}}}
//用Handler方法接子线程发来的数据private Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);seekBar.setProgress(msg.what);curtimetv.setText(fromatTime(msg.what));//右边时间获取当前进度条位置}};MusicThread musicThread=new MusicThread();new Thread(musicThread).start();//启动线程

4.。碟片合成,获取音乐的专辑封面,和黑色碟片图片进行合成

如上图所示,碟片合成,其实是如下3个Bitmap的合成:

自定义的透明Bitmap,画到一个圆形画布上
专辑图片Bitmap
碟片底图Bitmap
首先用圆形画布画出一个圆盘,然后将专辑图片和这个圆形画布合并,最后再将碟片底图合并上去。

public class MergeImage {/*** 合成碟片图片** @param discBitmap  黑胶碟片底图* @param albumBitmap 专辑封面图* @return*/public static Bitmap mergeThumbnailBitmap(Bitmap discBitmap, Bitmap albumBitmap) {//获得黑胶碟片底图宽和高int w = discBitmap.getWidth();int h = discBitmap.getHeight();//根据黑胶碟片底图的宽和高,对专辑图片进行缩放albumBitmap = Bitmap.createScaledBitmap(albumBitmap, w, h, true);Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bm);Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);//这里需要先画出一个圆canvas.drawCircle(w / 2, h / 2, w / 2 - 20, paint);//圆画好之后将画笔重置一下paint.reset();//设置图像合成模式,该模式为只在源图像和目标图像相交的地方绘制源图像paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));canvas.drawBitmap(albumBitmap, 0, 0, paint);paint.reset();canvas.drawBitmap(discBitmap, 0, 0, null);return bm;}
}
//调用事例:
Bitmap bm = MergeImage.mergeThumbnailBitmap(discBitmap,thumbBitmap);
musicAlbumImg.setImageBitmap(bm);

使用AndriodStudio制作音乐播放器之音乐播放界面(进度条正常播放、上、下曲切换)相关推荐

  1. 【FFmpeg】ffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )

    FFmpeg 系列文章目录 [FFmpeg]Windows 搭建 FFmpeg 命令行运行环境 [FFmpeg]FFmpeg 相关术语简介 ( 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 ...

  2. 使用AndriodStudio制作音乐播放器之音乐播放界面(旋转动画、正在播放的提示红条)

    思路: 制作旋转动画: 创建一个全局的动画变量:private ObjectAnimater objectAnimator; 在方法体里定义动画属性: 在点击按钮事件里启动或者暂停动画: 制作正在播放 ...

  3. 简单音乐播放器,可拖动进度条。完整代码demo

    效果图: 可播放暂停继续播放,进度条可拖动,时间展示,声音调节 完整代码(直接拿来用) <!DOCTYPE html> <html> <head> <meta ...

  4. 安卓自定义视频播放器,有进度条暂停播放等功能

    安卓视频播放页代码 package com.example.test1;import android.content.Context; import android.content.Intent; i ...

  5. 控制 video 标签的控制栏组件(隐藏、显示进度条、播放按钮、全屏按钮等)

    当 video 标签添加上 controls 属性时,页面上会显示出所有的控制组件.若有些组件不需要只需要在css中设置相关属性把它隐藏掉即可. <video controls></ ...

  6. 阿里web播放器微信浏览器打开进度条设置和时间获取

    解决的问题: 1.阿里云的web播放器:移动端(安卓是红米手机和苹果11)在微信浏览器打开适用,pc端谷歌浏览器打开适用,其他没测. 2.全代码直接用,进度条没办法完全禁止拖动,只能快进就让他回到上一 ...

  7. 阿里播放器踩坑记录 进度条重构 video loadByUrl失效解决方案

    如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 文档地址:https://player.alicdn.com/aliplayer/index. ...

  8. CSS_控制 video 标签的控制栏组件(隐藏、显示进度条、播放按钮、全屏按钮等)

    当 video 标签添加上 controls 属性时,页面上会显示出所有的控制组件.若有些组件不需要只需要在css中设置相关属性把它隐藏掉即可. <video controls></ ...

  9. iOS 音乐播放器之锁屏效果+歌词解析

    概述 功能描述:锁屏歌曲信息.控制台远程控制音乐播放:暂停/播放.上一首/下一首.快进/快退.列表菜单弹框和拖拽控制台的进度条调节进度(结合了QQ音乐和网易云音乐在锁屏状态下的效果).歌词解析并随音乐 ...

最新文章

  1. 多级联动下拉菜单插件:jquery.cxselect.js
  2. HTML DOM 第五篇
  3. 主线程如何等待多线程完成 返回数据_多线程基础体系知识清单
  4. python3 tkinter
  5. cobar mysql cluster_Cobar使用文档(可用作MySQL大型集群解决方案)
  6. 说干就干的p2psearcher2013
  7. centos下mysql更改数据存放目录_CentOS下mysql更改数据存放目录 --转载
  8. mac忘记MySQL初始密码
  9. idea代码补全_不想得手指关节炎?帮你提炼IDEA常用代码补全操作
  10. Linux系统中提示/usr/bin/ld: cannot find -lxxx错误的通用解决方法
  11. 火星上网不是梦,国际空间站开测星际互联网DTN服务
  12. 0基础参加数学建模,最大程度冲击奖项
  13. JS中各种width和height的区别
  14. 学生请假管理系统(需求说明+项目(部分代码))
  15. 无lnternet_为什么无internet访问权限,无lnternet访问权限怎么办
  16. 『杭电1869』六度分离
  17. python学习---画3d曲线曲面图
  18. 对比homeassistant和智汀家庭云之docker安装部署篇
  19. [现代控制理论]10_可观测性与分离原理_观测器与控制器
  20. Floyd算法、Dijkstra算法例题

热门文章

  1. 202301读书笔记|《命运》蔡崇达
  2. python编程语言介绍-编程语言及python介绍
  3. 如何成为一名优秀的程序员?首先你需要......
  4. 使用Folx下载多个文件时如何控制不同下载速度
  5. 聚合函数处理excel数据------(一)
  6. MapReduce中的自定义多目录/文件名输出转
  7. java 类转换_java实体类转换有没有更优雅的方式?
  8. 最新最全的非常有趣的逻辑推理题目大全
  9. 计算机 发声原理,单片机的发声原理
  10. 使用wildfly部署项目