android 歌词开源框架,Android开源在线音乐播放器——波尼音乐

波尼音乐

1c0f5c4f64fa

系列文章

前言

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

简介

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

播放本地音乐与在线音乐

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

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

歌词显示,自动搜索歌词

编辑歌曲信息

夜间模式

定时关闭

更新说明

v 1.3.0

新增歌词支持上下拖动

新增支持分屏模式

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

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

新增编辑歌曲信息

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

修复已知bug

v 1.2.3

新增通知栏播放控制

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

修复已知bug

v 1.2.0

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

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

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

下载在线歌曲可以显示专辑封面了

修复已知bug

v 1.1.0

支持 Android 6.0 运行时权限

修复已知bug

v 1.0.0

First Release

下载地址

V1.3.1

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

}

歌词绘制流程

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

}

}

截图

1c0f5c4f64fa

image

1c0f5c4f64fa

image

1c0f5c4f64fa

image

1c0f5c4f64fa

image

1c0f5c4f64fa

image

1c0f5c4f64fa

image

关于作者

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值