先说原理:音乐播放需要使用到Service,而播放栏也是属于音乐播放的,那么为什么我们不把这两者合在一起呢?

把UI和音乐Service合在一起,用Service来控制UI界面不是更简单。在进入Activity的时候判定是否播放列表不为空或者是否正在播放音乐来动态添加UI界面。简单的这样就实现了播放栏的常驻(虽然只是看起来,但是挺简单的,完成后效果也不错)。

实现:

1.建立MusicService类,继承自Service基类,并且实现基本的音乐播放逻辑,这里我实现了添加播放列表以及播放的方法。我预想的网易云音乐的播放面板存在逻辑为,只要播放列表不为空以及列表内存在可播放音乐,就存在这个音乐播放控制面板。这里为了简单,我们就先只检查播放列表是否为空,不为空就实例化出来播放控制面板。为空的话就去掉。这里我Activity发消息给Service是通过绑定开启服务的方式,具体实现不再赘述,直接说添加播放列表方法:

在Service中定义添加播放列表方法,如果是只添加一首,那么就播放这一首,添加多首就不改变当前的播放状态:

/*** 添加音乐到播放列表,添加一首*/private void addPlayListInner(Mp3Info mp3s){if(!PlayList.contains(mp3s)){//不存在这首歌曲,直接存入//播放这首歌返回Help.INSERT_VALUES_TO_SQLITE(PlayListContentProvider.CONTENT_SONGS_URI,mp3s);//存入数据库保存PlayList.add(mp3s);CurrentPlayPosition = PlayList.size()-1;//赋值当前播放位置为现在的位置}//播放当前音乐playInner(CurrentPlayPosition);}

下面再来看播放方法(只是一个基础例子,需要完善的还有很多):

/*** 实现方法** @param position 播放位置** @return*/private boolean playInner(int position){try {playPreInner(position);mediaPlayer.start();isPlaying = true;CreateFloatView();setPlayBarValue(PlayList.get(CurrentPlayPosition),mediaPlayer);//设置播放栏//使用定时器提交播放进度Timer timer = new Timer();TimerTask task = new TimerTask(){@Overridepublic void run(){musicProcessBar.setProgress(mediaPlayer.getCurrentPosition());}};timer.schedule(task,0,1000);}catch(Exception e){e.printStackTrace();}return true;}

可以看到,上面播放音乐的方法中我们调用了一个方法,是CreateFloatView()--这是用来创建播放控制面板的,实现如下:
布局文件:

<?xml version="1.0" encoding="utf-8"?>
<!--浮动音乐控制布局-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:id="@+id/float_Music_Container"android:orientation="vertical"android:background="@color/colorHalfTransparentWrite"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:background="@color/colorHalfTransparentWrite"><!--音乐图片--><ImageViewandroid:id="@+id/float_MusicImage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_centerVertical="true"/><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:layout_toEndOf="@+id/float_MusicImage"android:layout_marginLeft="5dp"><TextViewandroid:id="@+id/float_Music_Name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20dp"android:textColor="#000000"/><TextViewandroid:id="@+id/float_Music_Artist"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/colorPrimarySliver"android:textSize="14dp"android:layout_marginTop="3dp"/></LinearLayout><!--右边的控制按钮--><RelativeLayoutandroid:layout_width="180dp"android:layout_height="50dp"android:layout_centerVertical="true"android:layout_alignParentEnd="true"><!--播放列表按钮--><ImageViewandroid:id="@+id/float_Play_List"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:layout_centerVertical="true"android:src="@drawable/playbar_btn_playlist"/><!--播放或者暂停按钮--><ImageViewandroid:id="@+id/float_Play_Btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:src="@drawable/playbar_play_btn"/><!--下一曲音乐--><ImageViewandroid:id="@+id/float_Next_Music"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentEnd="true"android:layout_centerVertical="true"android:src="@drawable/playbar_play_next_btn"/></RelativeLayout></RelativeLayout>
<!--音乐进度--><ProgressBarandroid:id="@+id/float_Music_ProgressBar"android:layout_width="match_parent"android:layout_height="wrap_content"android:progress="0"android:visibility="visible"style="@style/ProgressBar_Mini"/></LinearLayout>

实现方法:

/*** 建立底部浮动栏的方法*/public void CreateFloatView(){if(PlayList.size() > 0) {mFloatView = LayoutInflater.from(getBaseContext()).inflate(R.layout.float_music_control_layout,null);ViewGroup mDecorView = (ViewGroup)StaticValue.NowActivity.getWindow().getDecorView();mContentContainer = (FrameLayout)((ViewGroup)mDecorView.getChildAt(0)).getChildAt(1);FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);musicProcessBar = (ProgressBar)mFloatView.findViewById(R.id.float_Music_ProgressBar);musicImageView = (ImageView)mFloatView.findViewById(R.id.float_MusicImage);musicNameTextView = (TextView)mFloatView.findViewById(R.id.float_Music_Name);musicArtistTextView = (TextView)mFloatView.findViewById(R.id.float_Music_Artist);musicPlayBtn = (ImageView)mFloatView.findViewById(R.id.float_Play_Btn);musicNextBtn = (ImageView)mFloatView.findViewById(R.id.float_Next_Music);musicPlayListBtn = (ImageView)mFloatView.findViewById(R.id.float_Play_List);mFloatView.findViewById(R.id.float_Music_Container).setOnClickListener(this);musicPlayBtn.setOnClickListener(this);musicPlayListBtn.setOnClickListener(this);musicNextBtn.setOnClickListener(this);//获取当前正在播放的音乐layoutParams.gravity = Gravity.BOTTOM;//设置对齐位置mContentContainer.addView(mFloatView,layoutParams);if(! mediaPlayer.isPlaying()) {//没有正在播放的,准备当前位置的音乐,设置值playPreInner(- 1);}setPlayBarValue(PlayList.get(CurrentPlayPosition),mediaPlayer);//设置播放控制面板的值}}

可以看到,这里又调用了一个setPlayBarVlaue(mp3info,MediaPlayer)方法,下面我们来看看实现:

/*** 设置播放栏的值* @param NowMp3 正在播放的mp3对象* @param mediaPlayer1 当前的mediaPlayer对象*/private void setPlayBarValue(Mp3Info NowMp3,MediaPlayer mediaPlayer1){musicProcessBar.setMax(mediaPlayer1.getDuration());//设置播放进度进度条最大值,musicProcessBar.setProgress(mediaPlayer1.getCurrentPosition());//设置播放进度条当前进度值musicNameTextView.setText(NowMp3.getDisplayName());//设置音乐名称musicImageView.setImageResource(R.drawable.ic_menu_gallery);//设置音乐专辑图片musicArtistTextView.setText(NowMp3.getArtist());//设置歌手名称//设置为暂停的图片musicPlayBtn.setImageResource(R.mipmap.playbar_btn_pause);}

我们接着在服务的onCreate方法中调用CreateFloatView()方法以便打开应用的时候检测是否添加播放栏,还有

重点::::

在onResume()方法中也调用CreateFloatView()方法,这样才能让已经被挂起的Activity重新进入前台时能够检查是否添加播放栏!

在onResume()方法中也调用CreateFloatView()方法,这样才能让已经被挂起的Activity重新进入前台时能够检查是否添加播放栏!

在onResume()方法中也调用CreateFloatView()方法,这样才能让已经被挂起的Activity重新进入前台时能够检查是否添加播放栏!

事重三!

,下面看看效果:

由于这种效果使用静态图片不好观看,动态图还没弄好软件,我看再搞搞,先忍受这个东西吧:

程序进入:

点击音乐栏目:

点击本地音乐:

点击扫描:

扫描完成:

回到音乐界面:

点击一首歌曲播放,播放面板就显示出来了!:

现在我们返回主界面看看是否有播放面板:

播放面板已经有了,说明我们的逻辑是对的,看起来效果也还不错。

需要源码的我已经上传到了我的CSDN 下载地址:http://download.csdn.net/detail/qq_21265915/9661736

最后,如有错误欢迎指正

安卓 实现网易云音乐底部播放栏效果之使用UI绑定到Service上实现相关推荐

  1. android+仿最新网易云音乐底面栏,安卓仿网易云音乐通知栏控制音乐,默认显示Notification bigView...

    最近在做一个音乐播放器的时候遇到了一个关于notification的问题,在网上找了很久都没有头绪.后来找到了解决的办法,特意记录一下. 问题描述 首先请看网易云音乐的通知栏 普通高度的notific ...

  2. Android初级,实现网易云音乐歌曲列表界面效果,播放界面效果,ListView,ViewPager方法详解

    初学Android初级,第一篇博客文章,如有错误,还望批评指正! 本文主要内容以网易云音乐歌曲列表界面效果代码,播放音乐界面效果代码为主,并将ListView和ViewPager作为实现界面滑动功能的 ...

  3. 网易云音乐——歌曲播放器页面

    网易云音乐--歌曲播放器页面 git地址 https://gitee.com/chen-haibin799/netease-cloud-music.git 实现步骤 效果图 1.实现顶部导航栏 这个写 ...

  4. 获得网易云音乐歌曲播放的url

    获得网易云音乐歌曲播放的url 首先打开F12开发者工具,点击NetWork,Media过滤一些不必要的请求 搜索你要的歌曲,这里例举阿司匹林 点击播放 这边会显示请求 点击Size最大的请求,复制其 ...

  5. 仿网易云音乐的播放进度条

    仿网易云音乐的播放进度条,有三种状态:播放.暂停和拖动,只是实现了动画和主要的交互逻辑,其他细节(如暂停音乐的播放等)还需要自己完善: DKPlayerBar 是继承于UIControl的,如果想获取 ...

  6. 计算机毕业设计Python+uniapp+安卓仿网易云音乐客户端APP(WEB+APP+LW)

    计算机毕业设计Python+uniapp+安卓仿网易云音乐客户端APP(WEB+APP+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区 ...

  7. Java和vue实现音乐播放器_vue实现的网易云音乐在线播放和下载功能案例

    本文实例讲述了vue实现的网易云音乐在线播放和下载功能.分享给大家供大家参考,具体如下: 效果如图: 完整代码: Document html, body { height: 100%; padding ...

  8. axure源文件_Axure教程:实现网易云音乐有声播放效果

    为了方便讲解,我们首先在桌面新建一个文件夹,命名为音乐.1.将自己想要演示播放的MP3音乐文件放在这个文件夹里面.2.给播放页添加一个中继器,随便命名,我给它命名为[音乐地址链接器],用来链接播放本地 ...

  9. 仿网易云音乐app tab栏滑动效果

    <!DOCTYPE html> <html><head><meta charset="utf-8"><meta name=&q ...

最新文章

  1. java中 如何用if_不在Java中使用if语句
  2. 数据“土豪”电信云告诉你,如何“玩转”数据生态
  3. Java isAlive()和join()的使用
  4. SCCM2012 R2实战系列之九:OSD(中)-- 捕获镜像
  5. mysql 查询表的key_mysql查询表和字段的注释
  6. 2017 Q1网络安全市场报告:未来5年,全球网络安全支出将超过1万亿美元
  7. nodejs的安装和使用
  8. 【mysql5.6】数据类型
  9. python3.7语法错误_Tweepy不会安装在Python3.7上;显示“语法错误”
  10. 经济周期的定义、阶段及特点-宏观经济指标和政策
  11. 怎么制作GIF图片并添加文字
  12. SpringCloud之Zuul微服务网关 什么是Zuul微服务网关?
  13. 计算机基础知识进制的转换,计算机基础之各进制间的相互转换
  14. 安装服务器系统提示没有驱动程序,安装windows server系统提示“无法在此驱动器上安装windows”的解决办法 安装Win...
  15. 台架控制器-AVL_ISAC学习
  16. 文件共享服务器如何提高网速,局域网共享文件传输速度很慢怎么办
  17. linux自定义自动补全命令
  18. 2020北京邮电大学计算机学院复试经验分享
  19. (一)计算机基本组成
  20. 方法技能:使用SXEarth下载遥感影像与高程数据,并使用MapGIS10进行三维显示

热门文章

  1. 哈工大李治军老师操作系统笔记【10】:内核级线程实现(Learning OS Concepts By Coding Them !)
  2. SQLServer存储过程中break、continue及return的使用
  3. java如何获取一个对象的大小
  4. 乐理知识(和弦相关)
  5. 用python让excel 飞起来(数据处理与分析操作)
  6. 2021年电工(初级)考试及电工(初级)报名考试
  7. 西瓜书学习记录_绪言
  8. canvas粒子线条插件使用
  9. html怎么在线安装,web前端零基础学习教程,如何安装HTML编辑器!
  10. Python爬虫自学笔记(三)动态网页爬取