制作安卓PDF閱讀器:二、處理慣性滑動(fling)

安卓處理慣性滑動的類是 OverScroller ,觸發(fā) fling 后 ( GestureDetector ),需多次調(diào)用其computeScrollOffset方法進行相關(guān)的計算:

if(flingScroller.computeScrollOffset()){
    int cfx = flingScroller.getCurrX();
    int cfy = flingScroller.getCurrY();
    //CMN.Log("fling...", cfx - mLastFlingX, cfy - mLastFlingY, flingScroller.getCurrVelocity());
    
    float dx = cfx - mLastFlingX;
    float dy = cfy - mLastFlingY;
    
    // 用 dx、dy 更新視圖
} else {
    // 慣性滑動結(jié)束
}

那么在哪里調(diào)用 OverScroller 呢,之前我以為是在 runnable 中,然后循環(huán)調(diào)用直至滑動結(jié)束。

private Runnable flingRunnable = new Runnable() {
    @Override
    public void run() {
        viewPoster.removeCallbacks(this);
        if(flingScroller.computeScrollOffset()){
            ...
            invalidate();
            post(this); // 循環(huán)調(diào)用
        } else {
            ...
        }
    }

}

這樣處理,在原本的 subsmapling-scale-imagview 中顯示圖片還好,可是在這個項目中,PDF渲染的高清鋪塊稍微多一點,就有明顯的卡頓現(xiàn)象。

蹊蹺的是,卡頓僅發(fā)生在慣性滑動的過程中,單、雙指移動,移動得再快也不卡,這是為什么呢?

觀察同類項目 AndroidPdfViewer ,卻沒有這個問題。

原來,AndroidPdfViewer 并未使用循環(huán)post的方法,而是復寫了 View.computeScroll 方法,在這個方法中處理 fling。

OverScroller 需與 computeScroll 配套使用,而 computeScroll 似乎是在繪制時自動回調(diào)的。這樣一來果然消除了 fling 時的卡頓,效果拔群,順暢無比,秒殺靜讀天下、ezpdf reader 等經(jīng)典應(yīng)用。

    {
        // post(this); // 循環(huán)調(diào)用
        ...
    }

    @Override
    public void computeScroll() {
        super.computeScroll();
        flingRunnable.run();
    }

參考:https://github.com/barteksc/AndroidPdfViewer/blob/d243b39377f19c3eae41e227067da254ebbf731b/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PDFView.java#L457

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容