一款开源Android在线音乐播放器
本文是wangchenyan同学的一个毕业设计作品,对于想研究音乐播放器的同学,特别是歌词自定义滚动部分。如下:支持自动滚动,超长歌词自动换行,自定义属性。
简介
波尼音乐是一款开源Android在线音乐播放器。
播放本地音乐与在线音乐
在线音乐排行榜,如热歌榜、新歌榜等
高仿云音乐的黑胶唱片专辑封面
歌词显示,自动搜索歌词
夜间模式
定时关闭
更新说明
新增通知栏播放控制
修复魅族手机扫描不到音乐的问题
修复已知bug
修复在线音乐无法加载的问题
修复弱网时播放网络歌曲导致ANR的问题
修复每日启动图片无法更新的问题
下载在线歌曲可以显示专辑封面了
修复已知bug
支持 Android 6.0 运行时权限
修复已知bug
First Release
公开API
在线音乐:百度音乐
天气数据:高德地图
开源技术
okhttp-utils
Glide
关键代码
黑胶唱片专辑封面绘制流程
@Override
protected void onDraw(Canvas canvas) {// 1.绘制顶部虚线mTopLine.setBounds(0, 0, getWidth(), mTopLineHeight);mTopLine.draw(canvas);// 2.绘制黑胶唱片外侧半透明边框mCoverBorder.setBounds(mDiscPoint.x - mCoverBorderWidth, mDiscPoint.y - mCoverBorderWidth,mDiscPoint.x + mDiscBitmap.getWidth() + mCoverBorderWidth, mDiscPoint.y +mDiscBitmap.getHeight() + mCoverBorderWidth);mCoverBorder.draw(canvas);// 3.绘制黑胶// 设置旋转中心和旋转角度,setRotate和preTranslate顺序很重要mDiscMatrix.setRotate(mDiscRotation, mDiscCenterPoint.x, mDiscCenterPoint.y);// 设置图片起始坐标mDiscMatrix.preTranslate(mDiscPoint.x, mDiscPoint.y);canvas.drawBitmap(mDiscBitmap, mDiscMatrix, null);// 4.绘制封面mCoverMatrix.setRotate(mDiscRotation, mCoverCenterPoint.x, mCoverCenterPoint.y);mCoverMatrix.preTranslate(mCoverPoint.x, mCoverPoint.y);canvas.drawBitmap(mCoverBitmap, mCoverMatrix, null);// 5.绘制指针mNeedleMatrix.setRotate(mNeedleRotation, mNeedleCenterPoint.x, mNeedleCenterPoint.y);mNeedleMatrix.preTranslate(mNeedlePoint.x, mNeedlePoint.y);canvas.drawBitmap(mNeedleBitmap, mNeedleMatrix, null);
}
歌词绘制流程
@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 中心Y坐标float centerY = getHeight() / 2 + mTextSize / 2 + mAnimOffset;// 无歌词文件if (!hasLrc()) {float centerX = (getWidth() - mCurrentPaint.measureText(label)) / 2;canvas.drawText(label, centerX, centerY, mCurrentPaint);return;}// 画当前行String currStr = mLrcTexts.get(mCurrentLine);float currX = (getWidth() - mCurrentPaint.measureText(currStr)) / 2;canvas.drawText(currStr, currX, centerY, mCurrentPaint);// 画当前行上面的for (int i = mCurrentLine - 1; i >= 0; i--) {String upStr = mLrcTexts.get(i);float upX = (getWidth() - mNormalPaint.measureText(upStr)) / 2;float upY = centerY - (mTextSize + mDividerHeight) * (mCurrentLine - i);// 超出屏幕停止绘制if (upY - mTextSize < 0) {break;}canvas.drawText(upStr, upX, upY, mNormalPaint);}// 画当前行下面的for (int i = mCurrentLine + 1; i < mLrcTimes.size(); i++) {String downStr = mLrcTexts.get(i);float downX = (getWidth() - mNormalPaint.measureText(downStr)) / 2;float downY = centerY + (mTextSize + mDividerHeight) * (i - mCurrentLine);// 超出屏幕停止绘制if (downY > getHeight()) {break;}canvas.drawText(downStr, downX, downY, mNormalPaint);}
}
截图
Github地址:点击阅读原文
一款开源Android在线音乐播放器相关推荐
- Android在线音乐播放器
波尼音乐 系列文章 Android开源在线音乐播放器--波尼音乐 Android开源音乐播放器之播放器基本功能 Android开源音乐播放器之高仿云音乐黑胶唱片 Android开源音乐播放器之自动滚动 ...
- MKOnlineMusicPlayer 开源的在线音乐播放器
简介 MKOnlineMusicPlayer 是一款开源的基于 Meting 的在线音乐播放器.具有音乐搜索.播放.下载.歌词同步显示.个人网易云音乐播放列表同步等功能. 前端界面参照 QQ 音乐网页 ...
- Android 在线音乐播放器
在线音乐播放器的重点是找到一个好的音乐搜索接口,下面是采用百度音乐搜索的接口,不过是非官方的,百度好像没有提供专门的音乐搜索API. 音乐搜索的两种方式 通过歌曲名和歌手精确搜索 访问:http:// ...
- 轻量级音乐播放器 android,5款顶级Android离线音乐播放器,哪款才是你的菜?
打开左侧栏,Stellio 的功能排列井井有条.你可以选择多样的播放队列,根据专辑.演奏者等属性快速找到想要的歌曲. 重视细节的Stellio 还有睡眠模式.自定义widget 等小功能.难能可贵的是 ...
- android在线音乐播放器教程,android实现简单音乐播放器
本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已.因为我们Andoird课程要求写一个音乐播放器.所以就有了此项 ...
- Andriod小项目——在线音乐播放器
Andriod小项目--在线音乐播放器 转载请注明:http://blog.csdn.net/sunkes/article/details/51189189 Android在线音乐播放器 从大一开始就 ...
- android 带记忆功能的播放器源码,【全开源可二开】带后台管理面板的在线音乐播放器Android应用APP源码...
这是一款带后台管理面板的在线音乐播放器Android应用APP源码,可让您更快地构建在线和离线android音频播放器,代码全开源适合二次开发.该源码自带2个紫色和橙色主题(允许您添加更多主题),多语 ...
- 三款Android平台音乐播放器多方位对比
音乐播放器作为重要的娱乐工具,在PC端异常重要,在移动端同样如此.移动端的音乐播放器很多,巨头们纷纷在这个领域布局,腾讯百度等均拥有各自的移动端音乐播放器.爱好音乐的机友们也面临较多的选择. 小编在这 ...
- 几款最主流的音乐播放器应用源码-android源码
影音播放 优雅音乐播放器应用源码 这是一款不错的音乐播放器应用源码案例,优雅音乐播放器应用源码,该应用的界面有点类似小米音乐播放器,应用的整天布局还没有那 人气:3328运行环境:/android/i ...
- java在线音乐播放器课程_[Java教程]15款最好的网站音乐播放器
[Java教程]15款最好的网站音乐播放器 0 2014-10-27 17:02:55 在互联网上有很多的脚本和插件,可以很容易将音乐播放功能集成到网站,以下是15款最好的网站音乐播放器. Flash ...
最新文章
- 基于Selenium2与Python自动化测试环境搭建
- 七、 熵编码算法(1)——基础知识
- 【pmcaff】苏杰:产品经理对技术做这些,就完蛋了
- 理解MySQL——索引与优化
- c盘users的用户名怎么改_iphone备份太大,严重挤占C盘空间怎么办?不用额外软件将备份放在C盘之外的教程...
- Java Date的after和before方法解释
- P5643-[PKUWC2018]随机游走【min-max容斥,dp】
- linux c mysql教程_Linux c访问mysql 编写入门
- python类的构造方法是_Python类中属性和构造方法的区别?
- Oracle OLAP 优化 这么玩!
- 题解【NOIP2013_火柴排序】— 问题与转化
- 将路由器当成交换机使用
- 织梦个人网站即时到账支付插件
- html页面如何引用母版页,内容页面访问母版页控件的两种方法
- selenium firefox 启动报错 Timed out wating 45 seconds for firefox to start
- 技术分享 | gh-ost 在线 ddl 变更工具​
- 计算机休眠是打不开,电脑自动进入睡眠模式打不开是为什么
- c++链表获取长度,链表翻转,查找链表倒数第K个节点以及中间点
- 怎么把pdf转换成高清图片
- 自增ID相同时报错: Database operation expected to affect 1 row(s) but actually affected 2 row(s)...