Android 开发之网易云音乐(或QQ音乐)的播放界面转盘和自定义SeekBar的实现

这个东西我在eoeAndroid上首发的,但没有详细的实现说明:http://www.eoeandroid.com/thread-317901-1-1.html

在csdn上进行详细的说明吧。(同时上两个社区,这真是个坏毛病,以后专注csdn好了)。

1.用过网易云音乐客户端应该都懂得它那个播放界面,是蛮炫的。先看我实现的效果图吧:

自定义SeekBar这里少了点东西,进度条应该有两种颜色表示进度,一种是当前播放进度,一种是下载进度。我只实现了第一个,第二个要实现的话还需要重载SeekBar。

2. 转盘实现过程:

(1).反编译网易云音乐apk,把它的图拿过来(这里主要是进度条和那个转盘以及把手(neddle意思好像更明确些));

(2).转盘的绘制,需要具备的2D绘图基础知识:

SurfaceView的使用;

canvas.save()和cavas.restore();的使用;

Matrix的使用;

如果您已经能够熟练的使用这些东西,那实现起来完全无障碍;当然如果不熟,也可以看下我的源码,哈哈。

(3)把柄是不动的,把图画上去即可;

中间的十字叉需要自己绘制的,创建一张位图,然后往这张位图上画一个正的十字叉;

假设转盘转一圈需要十秒,SurfaceView的刷新间隔是10ms,那么每绘制一次,旋转的角度增加为360 / (10000 / 10);超过360则重置为0;

把这个增量post给旋转矩阵,然后用这个旋转矩阵绘制出当前帧的位图;

(4)绘图函数:

[java] view plaincopyprint?

  1. private void doDraw(Canvas c) {
  2. // 去锯齿
  3. c.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
  4. | Paint.FILTER_BITMAP_FLAG));
  5. int cx = mWidth / 2;
  6. int cy = mHeight / 2;
  7. drawBmp(c, discBgBmp, cx, cy, null);
  8. if(mDiscMatrix == null){
  9. mDiscMatrix = new Matrix();
  10. mDiscMatrix.setTranslate(mWidth / 2 - discBmp.getWidth() / 2f,
  11. mHeight / 2 - discBmp.getHeight() / 2f);
  12. }
  13. if(mLcMatrix == null){
  14. mLcMatrix = new Matrix();
  15. mLcMatrix.setTranslate(mWidth / 2 - (discBmp.getWidth() - 60) / 2f,
  16. mHeight / 2 - (discBmp.getHeight() - 60) / 2f);
  17. }
  18. if (mIsPlay) {
  19. if (mRotates >= 360) {
  20. mRotates = 0;
  21. mDiscMatrix.reset();
  22. mLcMatrix.reset();
  23. mDiscMatrix.setTranslate(mWidth / 2 - discBmp.getWidth() / 2f,
  24. mHeight / 2 - discBmp.getHeight() / 2f);
  25. mLcMatrix.setTranslate(mWidth / 2 - (discBmp.getWidth() - 60) / 2f,
  26. mHeight / 2 - (discBmp.getHeight() - 60) / 2f);
  27. }
  28. mDiscMatrix.postRotate(everyRotate, cx, cy);
  29. mLcMatrix.postRotate(everyRotate, cx, cy);
  30. mRotates += everyRotate;
  31. }
  32. if(mLcBmp == null){
  33. int w = discBmp.getWidth() - 60;
  34. int h = discBmp.getHeight() - 60;
  35. mLcBmp = Bitmap.createBitmap(w, h, Config.ARGB_4444);
  36. Canvas c2 = new Canvas(mLcBmp);
  37. Paint p = new Paint();
  38. c2.drawColor(Color.TRANSPARENT, Mode.CLEAR);
  39. p.setColor(Color.LTGRAY);
  40. p.setStyle(Style.FILL);
  41. c2.drawCircle(w / 2, h / 2, Math.min(w, h) / 2, p);
  42. p.setColor(Color.DKGRAY);
  43. p.setStrokeWidth(10f);
  44. c2.drawLine(0, h / 2, w, h / 2, p);
  45. c2.drawLine(w / 2, 0, w / 2, h, p);
  46. }
  47. c.drawBitmap(mLcBmp, mLcMatrix, null);
  48. c.drawBitmap(discBmp, mDiscMatrix, null);
  49. int left = mWidth / 2 - needleBmp.getWidth();
  50. int top = 30;
  51. c.drawBitmap(needleBmp, left, top, null);
  52. }

3. 自定义SeekBar实现

这个东西应该除了入门者之外都已经掌握,这里也再啰嗦下,

来源于Android 源码的中SeekBar的style, 根据它的源码,将seekBar的style更改如下:

SeekBar 的Style:

[html] view plaincopyprint?

  1. <style name="SeekBar" parent="@android:style/Widget">
  2. <item name="android:indeterminateOnly">false</item>
  3. <item name="android:progressDrawable">@drawable/bg_seekbar</item>
  4. <item name="android:indeterminateDrawable">@drawable/bg_seekbar</item>
  5. <item name="android:minHeight">50dip</item>
  6. <item name="android:maxHeight">50dip</item>
  7. <item name="android:thumb">@drawable/bg_play_pause</item>
  8. <item name="android:thumbOffset">0dip</item>
  9. <item name="android:focusable">true</item>
  10. </style>

bg_seekbar的定义也是根据源码改的,为了显示正常,做了一点点裁切:

[html] view plaincopyprint?

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:id="@android:id/background">
  4. <nine-patch android:src="@drawable/play_ctrl_barbg"/>
  5. </item>
  6. <item android:id="@android:id/secondaryProgress">
  7. <clip>
  8. <scale android:drawable="@drawable/play_ctrl_readybar" android:scaleWidth="80%" />
  9. </clip>
  10. </item>
  11. <item android:id="@android:id/progress">
  12. <clip>
  13. <scale android:drawable="@drawable/play_ctrl_currbar" android:scaleWidth="80%" />
  14. </clip>
  15. </item>

其中标示的图像资源在源码中都可以找到。

layout中SeekBar引用这个style即可。

4. 源码下载地址:http://download.csdn.net/detail/lqh810/6721349

时间: 2024-07-30 23:48:03

Android 开发之网易云音乐(或QQ音乐)的播放界面转盘和自定义SeekBar的实现的相关文章

基于Taro与Typescript开发的网易云音乐小程序

基于Taro与网易云音乐api开发,技术栈主要是:typescript+taro+taro-ui+redux,目前主要是着重小程序端的展示,主要也是借此项目强化下上述几个技术栈的使用,通过这个项目也可以帮助你快速使用Taro开发一个属于你自己的小程序- 源码地址:taro-music,感兴趣的话可以star关注下,功能会进行持续完善 快速开始 首先需要在src目录下创建一个config.ts,可以根据自己的需要将其替换成线上地址,接口服务是使用的NeteaseCloudMusicApi expo

iOS 开发仿网易云音乐歌词海报

使用网易云音乐也是一个巧合,我之前一直使用QQ音乐听歌,前几天下 app 手机内存告急.于是就把QQ音乐给卸载掉了,正好晚上朋友圈里有一个朋友用网易云音乐分享了一首歌曲,于是我也就尝试下载了网易云音乐,这一下载就让我从QQ音乐粉转黑了. 从设计的角度来看,网易云音乐的界面简洁,慷慨,不像kugou音乐一打开就是各种广告.让人心烦.也不像QQ音乐那样动不动就各种音质,各种冲钻(不为用户需求考虑.仅仅想赚钱,差评).最关键的是它推荐的歌真是好听,实在是太懂我了,真的是非常用心的在做音乐. 废话不多说

Activity 通过 Fragment保存大块数据的一种方法。摘自android开发官网

http://developer.android.com/guide/topics/resources/runtime-changes.html Retaining an Object During a Configuration Change If restarting your activity requires that you recover large sets of data, re-establish a network connection, or perform other i

Android开发技巧——使用Dialog实现仿QQ的ActionSheet菜单

最近看到有人用Dialog来实现QQ的仿ActionSheet的自定义菜单,对于自己没实现过的一些控件,看着也想实现一下.于是动手了一下,发现也不难,和大家分享一下.本文原创,转载请注明出处:在这里我也是用Dialog来实现,代码不多,这里说一下实现的过程.菜单的布局文件首先我们写先一下菜单的布局文件,很明显,是一个ListView菜单再加一个取消的Button.<?xml version...http://www.douban.com/group/topic/75787270/ http://

Android开发app如何设定应用图标下的应用名称为汉字以及自定义图标

一.应用名称为汉字 二.自定义图标

使用网易云音乐,丢掉QQ音乐吧

我是一个听音乐的重度用户,基本上每天大约有三分之一的时间里我在使用网易云音乐去听音乐.包括工作写代码的时候,跑步的时候,去上班的途中我都去听.首先需要声明的是,在这里我不是故意的去抹黑其他的音乐产品,我只是谈谈我一个真实用户的真切感受. 由于喜欢听音乐的原因,自从开始接触互联网后,我便开始接触了很多音乐播放类产品,从早期的千千静听,酷我音乐,酷狗音乐,QQ音乐,豆瓣FM,虾米音乐,JingFM, 多米音乐,落网等等,有太多的音乐产品,我都数不过来.其实不难看出,网易做音乐类产品还是近两年才发力,

腾讯对网易云音乐发难背后的恐惧与担忧

文/王易见 日前,一则用腾讯用 300 万换来对网易云音乐禁令的消息在多家媒体不胫而走,很显然,这意味着腾讯正式对网易云音乐开炮了.和以前一样,媒体对类似事件仍抱着"看热闹不怕事儿大"的心态,还没有裁决结果就大量传播,以博取关注度和点击率.不过,这事儿也有"邪门儿"的地方,因为禁令不是裁定,这意味着此事件仍尚无定论,在这种情况下,媒体争相报道安的是什么心呢? 这恐怕需要从腾讯方面来找原因了,有业界人士认为,腾讯向网易云音乐开炮其用意在于维护自己的地位,对其他同行形成

受困版权,有情怀的网易云音乐还能走多远?

常听的歌单里,又有几首歌变灰了,这是网易云音乐的用户们心里的痛. 7月28日大批韩文歌下架,紧接着8月10日夜,大批华语歌下架,一首跟着一首歌变成灰色."我不得不用其他APP听歌了",这句带着歉意和遗憾的话,在这个"商场莫论情怀"的时代,带着让人伤感的动人力量. 随着9月12日腾讯音乐与阿里音乐就音乐版权互授问题达成协议,腾讯.阿里已经互相拥有了对方曲库的播放权,越来越多的人开始为网易云音乐担心起来. 2017年8月的数据,音乐市场上,MAU规模超亿的五大APP,前

软工书面作业1——分析网易云音乐的创新

在音乐APP中,网易云音乐算是地地道道的后发者,它的诞生比酷狗音乐.酷我音乐.QQ音乐等晚了数年,却以其卓越的创新能力.非凡的用户体验,很快超越了诸多先发者,成为如今国内数一数二的移动音乐应用软件.以下,我将从几方面分析网易云音乐的创新致胜之道. 1.功能创新:云歌单与音乐社交 在酷狗音乐.QQ音乐等巨头早早占据移动音乐市场的背景下,2013年才姗姗来迟的网易云音乐以功能创新突破桎梏.赢得市场.它从已有音乐APP的"歌曲列表"模块获得灵感,将这样的列表转化为"云列表"