波尼音乐

系列文章

前言

毕业设计作的项目,答辩完了,就共享出来。git

有问题请提Issues

若是喜欢,欢迎Star!

简介

波尼音乐是一款开源Android在线音乐播放器。github

播放本地音乐与在线音乐

在线音乐排行榜,如热歌榜、新歌榜等

高仿云音乐的黑胶唱片专辑封面

歌词显示,自动搜索歌词

编辑歌曲信息

夜间模式

定时关闭

更新说明

v 1.3.0express

新增歌词支持上下拖动

新增支持分屏模式

新增本地歌曲支持按大小和时长过滤

新增下载的歌曲文件自动添加专辑封面

新增编辑歌曲信息

新增5.0以上系统支持联动系统媒体中心,锁屏显示播放信息

修复已知bug

v 1.2.3apache

新增通知栏播放控制

修复魅族手机扫描不到音乐的问题

修复已知bug

v 1.2.0canvas

修复在线音乐没法加载的问题

修复弱网时播放网络歌曲致使ANR的问题

修复每日启动图片没法更新的问题

下载在线歌曲能够显示专辑封面了

修复已知bug

v 1.1.0api

支持 Android 6.0 运行时权限

修复已知bug

v 1.0.0缓存

First Release

下载地址

TODO

在线音乐能够免下载加入个人音乐列表

在线音乐自动缓存

编辑音乐信息

项目

公开API

在线音乐:百度音乐

天气数据:高德地图

开源技术

关键代码

黑胶唱片专辑封面绘制流程网络

@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);

}

复制代码

歌词绘制流程app

@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);

}

}

复制代码

截图

关于做者

License

Copyright 2016 wangchenyan

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

复制代码

迁移自个人简书 2016.06.08

android开源音乐播放器简单demo,Android开源在线音乐播放器——波尼音乐相关推荐

  1. android原生定时任务_一个简单的Android定时任务

    Android中(Service )服务的最佳实践--后台执行的定时任务 版权声明:本文为博主原创文章,未经博主允许不得转载.https://blog.csdn.net/u010046908/arti ...

  2. android百度网盘倍速,百度网盘在线倍数播放-全网最强,已做群组视频适配,不用保存文件也可倍速,无vip限制(附加安卓倍速版)...

    // ==UserScript== // @name 百度网盘在线倍数播放-全网最强,已做群组视频适配,不用保存文件也可倍速,无vip限制(附加安卓倍速版) // @namespace http:// ...

  3. Android ContentProvider 完全解析及简单DEMO

    Android应用程序运行在不同的进程空间中,因此不同应用程序的数据是不能够直接访问的.为了增强程序之间的数据共享能力,Android系统提供了像SharedPreferences这类简单的跨越程序边 ...

  4. android 结束if循环_简单探究Android平台下' if ' 语句条件判断耗时情况

    2017年6月13日 前言 前几日在改Bug时看到好多调试时用的日志语句都被一个日志开关控制着它的执行权.形如: 1 if(Constants.LOG_TAG){2 Log.d(TAG, " ...

  5. android 代码中使用dp,简单谈谈Android中SP与DP的区别

    从一开始写Android程序,就被告知这些常识 一.dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp=1px.不同 ...

  6. android 全局注入,一种简单的Android全局注入方案

    Xposed和Cydia Substrate是android上两款比较知名的全局Hook框架,但都不尽善尽美,有时为了实现某个功能往往要绕许多弯路去配合框架,结果也差强人意,与其浪费精力去熟悉框架不如 ...

  7. android studio开发整合资源简单实现android扫一扫功能

    开发安卓app过程中需要集成扫码功能,搜索的时候发现了 http://blog.csdn.net/yuzhiqiang_1993/article/details/52805057 这篇博客文章,写的很 ...

  8. android实现计算器功能吗,简单实现Android计算器功能

    自己写的安卓的计算器: 注:这个是在mac中开发的,如果要在windows的eclipse中运行可能会出现路径问题,解决办法从windows中已有的安卓工程根目录下复制一下classpath文件,然后 ...

  9. 百度SEO站群音乐聚合源码/自动采集(在线可播放)

    看着搜索引擎的聚合搜索源码满天飞,我就发个音乐的聚合源码吧,一个PHP就能搭建一个音乐站(抓取某狗音乐站点),全自动更新采集音乐,MV,等等-可自定义添加广告,源码全开源无加密,可二开~源码自适应手机 ...

  10. sony android mp3播放器,高音质与流媒体兼具,索尼 NW-ZX500 安卓音乐播放器评测

    原标题:高音质与流媒体兼具,索尼 NW-ZX500 安卓音乐播放器评测 用传统的音乐播放器来听歌,似乎已经逐渐变成了一个相对小众的需求. 在我眼里,曾被称呼为「随身听」的音乐播放器,已经逐渐被归类为如 ...

最新文章

  1. beanstalkd 协议中文版
  2. 笔记-高项案例题-2015年下-需求管理
  3. App设计灵感之十二组精美的手机闹钟App设计案例
  4. 第四章: 4.1 logging模块 | 正则表达式
  5. 16进制字符串转化为10进制数
  6. 区块链跟银行有什么关系?
  7. 自学篇之----html的所有input标签 以及post和get提交之间的区别
  8. UVA10800 Not That Kind of Graph【模拟+绘图】
  9. Sklearn 划分训练集和测试集
  10. 1110_win10专业版官方原版镜像64位
  11. 【2023王道数据结构】【树与二叉树】通过C++实现中序遍历的非递归算法(手动入出栈)C、C++完整实现(可直接运行
  12. Google - 搜索图片快速设置
  13. 缓存路由关联的两个生命周期activated和deactivated
  14. 关于外国人报考美国专利代理人的基础介绍
  15. 离散数学知识总结 第十一章 几种特殊的图
  16. SREcon大会预告 | 百度运维专家对智能故障诊断的思考
  17. hashmap hash冲突怎么解决_10个HashMap问题搞定面试官
  18. CC1101之信道空闲评估(CCA:Clear Channel Assessment)
  19. 计蒜客 蒜头君学英语
  20. python 进度条插件原理

热门文章

  1. IP地址中,A、B、C三类地址的区别
  2. c++ 中——fatal error: opencv2/opencv.hpp: No such file or directory #include <opencv2/opencv.hpp>
  3. 中国电信与阿里巴巴签署全面战略合作协议
  4. msvcp140.dll是什么?丢失了msvcp140.dll要如何修复?
  5. 学校后台管理系统 php,基于ssm的校园门户网站+后台管理系统
  6. python代码如何转java_将简单的Python代码转换为Java方法
  7. iOS gif加载视图
  8. win11系统下安装java 8的教程
  9. android 反编译jar包
  10. matlab卷积不从0开始,matlab 编辑卷积出错