美文网首页Android进阶
制作安卓PDF阅读器:二、处理惯性滑动(fling)

制作安卓PDF阅读器:二、处理惯性滑动(fling)

作者: 天下第九九八十一 | 来源:发表于2020-11-08 15:01 被阅读0次

安卓处理惯性滑动的类是 OverScroller ,触发 fling 后 ( GestureDetector ),需多次调用其computeScrollOffset方法进行相关的计算:

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 {
    // 惯性滑动结束
}

那么在哪里调用 OverScroller 呢,之前我以为是在 runnable 中,然后循环调用直至滑动结束。

private Runnable flingRunnable = new Runnable() {
    @Override
    public void run() {
        viewPoster.removeCallbacks(this);
        if(flingScroller.computeScrollOffset()){
            ...
            invalidate();
            post(this); // 循环调用
        } else {
            ...
        }
    }

}

这样处理,在原本的 subsmapling-scale-imagview 中显示图片还好,可是在这个项目中,PDF渲染的高清铺块稍微多一点,就有明显的卡顿现象。

蹊跷的是,卡顿仅发生在惯性滑动的过程中,单、双指移动,移动得再快也不卡,这是为什么呢?

观察同类项目 AndroidPdfViewer ,却没有这个问题。

原来,AndroidPdfViewer 并未使用循环post的方法,而是复写了 View.computeScroll 方法,在这个方法中处理 fling。

OverScroller 需与 computeScroll 配套使用,而 computeScroll 似乎是在绘制时自动回调的。这样一来果然消除了 fling 时的卡顿,效果拔群,顺畅无比,秒杀静读天下、ezpdf reader 等经典应用。

    {
        // post(this); // 循环调用
        ...
    }

    @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

相关文章

网友评论

    本文标题:制作安卓PDF阅读器:二、处理惯性滑动(fling)

    本文链接:https://www.haomeiwen.com/subject/slrhbktx.html