一款开源Android在线音乐播放器

时间:2021-10-06 20:44:24

本文是wangchenyan同学的一个毕业设计作品,对于想研究音乐播放器的同学,特别是歌词自定义滚动部分。如下:支持自动滚动,超长歌词自动换行,自定义属性。


一款开源Android在线音乐播放器


简介

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

  • 播放本地音乐与在线音乐

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

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

  • 歌词显示,自动搜索歌词

  • 夜间模式

  • 定时关闭

更新说明

  • 新增通知栏播放控制

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

  • 修复已知bug

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

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

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

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

  • 修复已知bug

  • 支持 Android 6.0 运行时权限

  • 修复已知bug

  • First Release

公开API

  • 在线音乐:百度音乐

  • 天气数据:高德地图

开源技术

  • okhttp-utils

  • Glide

关键代码

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

 
  1. @Override

  2. protected void onDraw(Canvas canvas) {

  3.    // 1.绘制顶部虚线

  4.    mTopLine.setBounds(0, 0, getWidth(), mTopLineHeight);

  5.    mTopLine.draw(canvas);

  6.    // 2.绘制黑胶唱片外侧半透明边框

  7.    mCoverBorder.setBounds(mDiscPoint.x - mCoverBorderWidth, mDiscPoint.y - mCoverBorderWidth,

  8.            mDiscPoint.x + mDiscBitmap.getWidth() + mCoverBorderWidth, mDiscPoint.y +

  9.                    mDiscBitmap.getHeight() + mCoverBorderWidth);

  10.    mCoverBorder.draw(canvas);

  11.    // 3.绘制黑胶

  12.    // 设置旋转中心和旋转角度,setRotate和preTranslate顺序很重要

  13.    mDiscMatrix.setRotate(mDiscRotation, mDiscCenterPoint.x, mDiscCenterPoint.y);

  14.    // 设置图片起始坐标

  15.    mDiscMatrix.preTranslate(mDiscPoint.x, mDiscPoint.y);

  16.    canvas.drawBitmap(mDiscBitmap, mDiscMatrix, null);

  17.    // 4.绘制封面

  18.    mCoverMatrix.setRotate(mDiscRotation, mCoverCenterPoint.x, mCoverCenterPoint.y);

  19.    mCoverMatrix.preTranslate(mCoverPoint.x, mCoverPoint.y);

  20.    canvas.drawBitmap(mCoverBitmap, mCoverMatrix, null);

  21.    // 5.绘制指针

  22.    mNeedleMatrix.setRotate(mNeedleRotation, mNeedleCenterPoint.x, mNeedleCenterPoint.y);

  23.    mNeedleMatrix.preTranslate(mNeedlePoint.x, mNeedlePoint.y);

  24.    canvas.drawBitmap(mNeedleBitmap, mNeedleMatrix, null);

  25. }

歌词绘制流程

 
  1. @Override

  2. protected void onDraw(Canvas canvas) {

  3.    super.onDraw(canvas);

  4.    // 中心Y坐标

  5.    float centerY = getHeight() / 2 + mTextSize / 2 + mAnimOffset;

  6.    // 无歌词文件

  7.    if (!hasLrc()) {

  8.        float centerX = (getWidth() - mCurrentPaint.measureText(label)) / 2;

  9.        canvas.drawText(label, centerX, centerY, mCurrentPaint);

  10.        return;

  11.    }

  12.    // 画当前行

  13.    String currStr = mLrcTexts.get(mCurrentLine);

  14.    float currX = (getWidth() - mCurrentPaint.measureText(currStr)) / 2;

  15.    canvas.drawText(currStr, currX, centerY, mCurrentPaint);

  16.    // 画当前行上面的

  17.    for (int i = mCurrentLine - 1; i >= 0; i--) {

  18.        String upStr = mLrcTexts.get(i);

  19.        float upX = (getWidth() - mNormalPaint.measureText(upStr)) / 2;

  20.        float upY = centerY - (mTextSize + mDividerHeight) * (mCurrentLine - i);

  21.        // 超出屏幕停止绘制

  22.        if (upY - mTextSize < 0) {

  23.            break;

  24.        }

  25.        canvas.drawText(upStr, upX, upY, mNormalPaint);

  26.    }

  27.    // 画当前行下面的

  28.    for (int i = mCurrentLine + 1; i < mLrcTimes.size(); i++) {

  29.        String downStr = mLrcTexts.get(i);

  30.        float downX = (getWidth() - mNormalPaint.measureText(downStr)) / 2;

  31.        float downY = centerY + (mTextSize + mDividerHeight) * (i - mCurrentLine);

  32.        // 超出屏幕停止绘制

  33.        if (downY > getHeight()) {

  34.            break;

  35.        }

  36.        canvas.drawText(downStr, downX, downY, mNormalPaint);

  37.    }

  38. }

截图


一款开源Android在线音乐播放器一款开源Android在线音乐播放器一款开源Android在线音乐播放器一款开源Android在线音乐播放器一款开源Android在线音乐播放器一款开源Android在线音乐播放器


Github地址:点击阅读原文

一款开源Android在线音乐播放器