Android開源線上音樂播放器——波尼音樂

chay發表於2019-01-10

波尼音樂

Android開源線上音樂播放器——波尼音樂

系列文章

前言

畢業設計做的專案,答辯完了,就共享出來。

簡介

波尼音樂是一款開源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

下載地址

fir:fir.im/ponymusic

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);
    }
}
複製程式碼

截圖

image
image
image
image
image
image

關於作者

掘金:juejin.im/user/58abd9…
微博:weibo.com/wangchenyan…

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

相關文章