一款開源Android在線音樂播放器

    

本文是wangchenyan同窗的一個畢業設計做品,對於想研究音樂播放器的同窗,特別是歌詞自定義滾動部分。以下:支持自動滾動,超長歌詞自動換行,自定義屬性。canvas


圖片


簡介

波尼音樂是一款開源Android在線音樂播放器。網絡

  • 播放本地音樂與在線音樂ide

  • 在線音樂排行榜,如熱歌榜、新歌榜等spa

  • 高仿雲音樂的黑膠唱片專輯封面設計

  • 歌詞顯示,自動搜索歌詞指針

  • 夜間模式orm

  • 定時關閉blog

更新說明

  • 新增通知欄播放控制圖片

  • 修復魅族手機掃描不到音樂的問題get

  • 修復已知bug

  • 修復在線音樂沒法加載的問題

  • 修復弱網時播放網絡歌曲致使ANR的問題

  • 修復每日啓動圖片沒法更新的問題

  • 下載在線歌曲能夠顯示專輯封面了

  • 修復已知bug

  • 支持 Android 6.0 運行時權限

  • 修復已知bug

  • First Release

公開API

  • 在線音樂:百度音樂

  • 天氣數據:高德地圖

開源技術

  • okhttp-utils

  • Glide

關鍵代碼

黑膠唱片專輯封面繪製流程

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

歌詞繪製流程

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

截圖

圖片圖片圖片圖片圖片

圖片

相關文章
相關標籤/搜索