1. 程式人生 > >最簡單音樂播放器,還有歌詞

最簡單音樂播放器,還有歌詞

不是來說播放器的(前面我有一篇VLC的,可以倒回去看),這篇是來分享
這個顯示歌詞的,還是用了前一篇的PickerView的原理進行放大歌詞

使用知識點

  • 歌詞動態放大
    是不是原始碼看得少了,怎麼喜歡用這個定時器放大的效果。。。

  • 歌詞下載
    這是網上的一個方法,找了百度音樂和QQ音樂的資料來源

  • OkHttp
    用了鴻洋的庫okhttp-utils

    compile 'com.zhy:okhttputils:2.0.2'
  • 標題重點,系統音樂播放器MediaPlayer

具體程式碼

  • 歌詞動態放大

Handler + 定時器

float animLen = 0
; Timer timer; MyTimerTask mTask; MyHandler updateHandler = new MyHandler(this); private static class MyHandler extends WeakHandler<LyricView> { public MyHandler(LyricView owner) { super(owner); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); LyricView view = getOwner(); if
(Math.abs(view.animLen) < 2) { view.animLen = 0; if (view.mTask != null) { view.mTask.cancel(); view.mTask = null; } } else { view.animLen = view.animLen - view.animLen / Math.abs(view.animLen) * 2; } view.invalidate(); } } // 省略
public void setIndex(int time) { // 。。。 animLen = wordSize + INTERVAL; if (mTask != null) { mTask.cancel(); mTask = null; } mTask = new MyTimerTask(updateHandler); timer.schedule(mTask, 0, 20); } class MyTimerTask extends TimerTask { Handler handler; public MyTimerTask(Handler handler) { this.handler = handler; } @Override public void run() { handler.sendMessage(handler.obtainMessage()); } }

放大字型

float scale = parabola(hlWordSize, animLen);
int size = (int) ((hlWordSize - wordSize) * scale + wordSize);
hlPaint.setTextSize(size);
canvas.drawText(temp.lrc, viewWidth / 2, viewHeight / 2, hlPaint);

private float parabola(float zero, float x) {
    float f = (float) (1 - Math.pow(x / zero, 2));
    return f < 0 ? 0 : f;
}
  • 歌詞下載
    // 略

  • OkHttp

public abstract class InputStreamCallback extends Callback<InputStream>{

    @Override
    public InputStream parseNetworkResponse(Response response) throws IOException {
        return response.body().byteStream();
    }
}

OkHttpUtils.get().url(url).build().execute(new InputStreamCallback() {
    @Override
    public void onError(Request request, Exception e) {
        callBack(false);
    }

    @Override
    public void onResponse(InputStream response) {
        // 。。。
    }
});

OkHttpUtils.get().url(url).build().execute(new InputStreamCallback() {
    @Override
    public void onError(Request request, Exception e) {
        nextSearch();
    }

    @Override
    public InputStream parseNetworkResponse(Response response) throws IOException {
        // Thread Pool Thread
        return super.parseNetworkResponse(response);
    }

    @Override
    public void onResponse(InputStream response) {
    }
});
  • 標題重點,系統音樂播放器MediaPlayer
    // 略

原始碼下載