这个东西我在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)绘图函数:

  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:

  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的定义也是根据源码改的,为了显示正常,做了一点点裁切:

  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

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

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

    使用网易云音乐也是一个巧合,我之前一直使用QQ音乐听歌,前几天下 app 手机内存告急.于是就把QQ音乐给卸载掉了,正好晚上朋友圈里有一个朋友用网易云音乐分享了一首歌曲,于是我也就尝试下载了网易云音乐 ...

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

    基于Taro与网易云音乐api开发,技术栈主要是:typescript+taro+taro-ui+redux,目前主要是着重小程序端的展示,主要也是借此项目强化下上述几个技术栈的使用,通过这个项目也可 ...

  3. 基于Taro与typescript开发的网易云音乐小程序(持续更新)

    基于Taro与网易云音乐api开发,技术栈主要是:typescript+taro+taro-ui+redux,目前主要是着重小程序端的展示,主要也是借此项目强化下上述几个技术栈的使用,通过这个项目也可 ...

  4. 3.Android高仿网易云音乐-首页复杂发现界面布局和功能/RecyclerView复杂布局

    0.效果图 效果图依次为发现界面顶部,包含首页轮播图,水平滚动的按钮,推荐歌单:然后是发现界面推荐单曲,点击单曲就是直接进入播放界面:最后是全局播放控制条上点击播放列表按钮显示的播放列表弹窗. 1.整 ...

  5. Android开发学习之路--MediaPlayer之简单音乐播放器初体验

    很多时候我们都会用手机来播放音乐,播放视频,那么具体地要怎么实现呢,其实主要是MediaPlayer类来完成的.下面通过简单的例子来实现一首歌曲的播放吧.新建工程MediaPlayerStudy,这里 ...

  6. Ubuntu16.04 下的网易云出现网络异常、无法播放,界面无响应问题的统一解决

    能够在Linux系统下体验到原生界面的网易云音乐是件不错的事情,但是它总是经常性的出现网络异常,界面无响应的问题 为了听歌的体验,进行深入探究: 首先通过终端启用网易云音乐:sudo netease- ...

  7. MellPlayer, 基于网易云歌单的命令行播放器

    MellPlayer 前言 我写代码时非常喜欢听音乐,最近在网易云歌单中听到了许多入耳惊艳的歌,觉得非常不错.但是歌单的随机播放以及快速切换是个软肋,于是开发了MellPlayer,可以按照分类随机听 ...

  8. 【Android开发日记】之入门篇(十四)——Button控件+自定义Button控件

        好久不见,又是一个新的学期开始了,为什么我感觉好惆怅啊!这一周也发生了不少事情,节假日放了三天的假(好久没有这么悠闲过了),实习公司那边被组长半强制性的要求去解决一个后台登陆的问题,结果就是把 ...

  9. Android高仿网易云音乐-启动界面实现和动态权限处理

    效果 实现分析 基本上没有什么难点,就是布局,然后显示用户协议对话框,动态处理权限,判断是否显示引导界面,是否显示广告界面等. 布局 <?xml version="1.0" ...

随机推荐

  1. linux:如何修改用户的密码

    1.首先,要用CRT软件连接Linux系统. 2.首选,确认是用root用户登录系统的. 输入命令: id ,查看登录用户信息. 3.若修改root自己的密码,直接输入 passwd . 输入两遍,新 ...

  2. Android应用开发基础篇(12)-----Socket通信

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌 ...

  3. [C#绘图]Matrix类

    想要从入门到精通一门语言,最好的学习文档就是官方提供的文档,比如说OpenCV的学习,最权威的学习资料还是其官方的学习文档,C#和.net的最好的学习入门文档还是MSDN.但是好多人一开始真的不会用, ...

  4. nodebeginer

    最近对node开始感兴趣,知乎上朴灵推荐入门书籍,goddy翻译的node beginner. 貌似大家对深入浅出node.js评价都不错,以后可以考虑入手看看. 一口气看完了node beginne ...

  5. [LeetCode]题解(python):130-Surrounded Regions

    题目来源: https://leetcode.com/problems/surrounded-regions/ 题意分析: 给定给一个二维的板,这个板只包括‘X’和‘O’.将被‘X’包围的‘O’变成‘ ...

  6. Python collections.defaultdict 笔记

    其实defaultdict 就是一个字典,只不过python自动的为它的键赋了一个初始值.这也就是说,你不显示的为字典的键赋初值python不会报错,看下实际例子. 比如你想计算频率 frequenc ...

  7. Windows 8.1 IIS 8.5 远程管理 Windows 2008 R2 IIS 7.0

    案例: Windows 8.1 x64 IIS 8.5 inetmgr_amd64_v1.1_en-US.msi Windows 2008 R2  x64 IIS  7.0 在Win8.1 通过IIS ...

  8. Microsoft 收购 Apiphany

    StevenMartinMS 2013 年 10 月 23 日上午 10:00 今天,我高兴地宣布我们收购了业界领先的 API 管理交付平台 - Apiphany. 应用程序可扩展性已经不算什么新鲜事 ...

  9. CodeForces 150B- Quantity of Strings 推算..

    假设 k = 5 , n>k ,   (1,2,3,4,5)  -> 1=5,2=4,3任意 (2,3,4,5,6) -> 2=6,3=5,4任意...综合上面的可得出1=3=5,2 ...

  10. Android实现视频录制

    安卓实现视频录制,有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder. 每种方法都有自己的优缺点.接下来,把两种方法的代码写出来. 先说第一种方法,也是最简单的方法,那就是直接 ...