尝试检测WebView是否滚动到底部时出现奇怪的错误计算

时间:2013-12-11 07:33:43

标签: android android-webview

我在检测WebView滚动到底部时遇到问题。我使用以下代码:

@Override
protected void onScrollChanged(int x, int y, int oldX, int oldY) {
    super.onScrollChanged(x, y, oldX, oldY);

    int bottom = ((int) Math.floor(getContentHeight() * getScale()) - getHeight());
    MyLogger.log(y + "____" + bottom);

    if (y == bottom) {
        // Trigger listener
    }
}

记录为我提供了以下输出:

162____164

所以不知怎的,这里有2个像素误算,我不知道它来自哪里。

感谢。

2 个答案:

答案 0 :(得分:6)

你在那里的计算似乎是正确的。它最好表达为:

@Override
protected void onScrollChanged(int x, int y, int oldX, int oldY) {
    super.onScrollChanged(x, y, oldX, oldY);
    final int DIRECTION_UP = 1;
    if (!canScrollVertically(DIRECTION_UP)) {
        // Trigger listener.
    }
}

在某些情况下,您可能无法通过这种方式检测到您位于页面底部:

  • 如果页面正在使用触摸处理程序处理滚动,则pageScale()大于1.0。在这种情况下,在CSS坐标空间中检测到“bottom”,并且由于四舍五入,可能无法始终正确映射到android.view.View坐标空间(尽管这应该在KitKat中修复)。
  • 您或您正在使用的某个图书馆会覆盖WebView.scrollTo / overScrollBy / etc ..以禁止滚动一直向下移动。

作为最后的解决方法,您可以覆盖onOverScrolled

@Override
protected void onOverScrolled (int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
    if (scrollY > 0 && clampedY && !startedOverScrollingY) {
        startedOverScrollingY = true;
        // Trigger listener.
    }
    super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
}

@Override
protected void onScrollChanged(int x, int y, int oldX, int oldY) {
    super.onScrollChanged(x, y, oldX, oldY);
    if (y < oldY) startedOverScrollingY = false;
}

如果在最新的Android版本上重现,您可以file a bug report。理想情况下,创建一个简约的应用程序,用空白(或普通)页面重现问题。

答案 1 :(得分:0)

获得以下确切结果:

@Override
protected void onScrollChanged(int x, int y, int oldX, int oldY) {
    super.onScrollChanged(x, y, oldX, oldY);

    if (y == computeVerticalScrollRange() - getHeight()) {
        // Trigger listener
    }
}