本文是wangchenyan同窗的一個畢業設計做品,對於想研究音樂播放器的同窗,特別是歌詞自定義滾動部分。以下:支持自動滾動,超長歌詞自動換行,自定義屬性。canvas
波尼音樂是一款開源Android在線音樂播放器。網絡
播放本地音樂與在線音樂ide
在線音樂排行榜,如熱歌榜、新歌榜等spa
高仿雲音樂的黑膠唱片專輯封面設計
歌詞顯示,自動搜索歌詞指針
夜間模式orm
定時關閉blog
新增通知欄播放控制圖片
修復魅族手機掃描不到音樂的問題get
修復已知bug
修復在線音樂沒法加載的問題
修復弱網時播放網絡歌曲致使ANR的問題
修復每日啓動圖片沒法更新的問題
下載在線歌曲能夠顯示專輯封面了
修復已知bug
支持 Android 6.0 運行時權限
修復已知bug
First Release
在線音樂:百度音樂
天氣數據:高德地圖
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); }}