安卓 实现网易云音乐底部播放栏效果之使用UI绑定到Service上实现
来源:互联网 发布:网络营销策划书模板 编辑:程序博客网 时间:2024/05/12 04:07
先说原理:音乐播放需要使用到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"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:background="@color/colorHalfTransparentWrite"> <!--音乐图片--> <ImageView android:id="@+id/float_MusicImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_centerVertical="true"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_toEndOf="@+id/float_MusicImage" android:layout_marginLeft="5dp"> <TextView android:id="@+id/float_Music_Name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:textColor="#000000"/> <TextView android: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> <!--右边的控制按钮--> <RelativeLayout android:layout_width="180dp" android:layout_height="50dp" android:layout_centerVertical="true" android:layout_alignParentEnd="true"> <!--播放列表按钮--> <ImageView android: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"/> <!--播放或者暂停按钮--> <ImageView android: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"/> <!--下一曲音乐--> <ImageView android: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><!--音乐进度--> <ProgressBar android: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);//设置播放控制面板的值}}
/** * 设置播放栏的值 * @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上实现
- 安卓 实现网易云音乐底部播放栏效果之使用自定义BaseActivity实现 上
- 安卓 实现网易云音乐底部播放栏效果之使用自定义BaseActivity实现 下
- 网易云音乐底部播放栏实现思路
- 【Android】安卓开发实战之使用Fragment(碎片)实现底部导航栏效果
- 网易云音乐播放ui
- Service实现音乐播放
- 仿网易云音乐部分UI实现
- iOS-VLCKit实现仿网易云音乐播放音乐
- 安卓实现音乐播放器
- Android初级,实现网易云音乐歌曲列表界面效果,播放界面效果,ListView,ViewPager方法详解
- DerectX7实现播放音乐效果
- DerectX7实现播放音乐效果
- DerectX7实现播放音乐效果
- 网易云视频播放器不使用Service实现后台播放
- 安卓音乐播放器和视频播放器实现
- 使用绑定服务实现一个简单的音乐播放器
- Android之Service服务实现音乐播放器
- Android使用AudioRecord采集声音时声音播放很快解决方案
- linux免密登陆操作步骤?
- cpp 3.13
- eclipse 集成 android开发环境4大注意事项
- 谈UIView Animation编程艺术
- 安卓 实现网易云音乐底部播放栏效果之使用UI绑定到Service上实现
- TCP状态了解:
- idea导入maven工程的正确姿势:
- Atitit dsl对于数组的处理以及main函数的参数赋值
- Json和Xml优缺点比较
- Android样式的开发(一):shape篇
- ThinkPHP运算符 与 SQL运算符
- Shader山下(二十一)多重变体(Multiple Variants)
- extJS环境下tabPanel的切换事件、监听事件、刷新或重新载入