9

我试图在滚动达到最大值后拉动 webView “反弹”(有点像“拉动刷新”效果)。

我的自定义视图扩展了 WebView,并覆盖了该方法

 @Override
protected boolean overScrollBy(final int deltaX, final int deltaY, final int scrollX, final int scrollY, final int scrollRangeX, final int scrollRangeY, final int maxOverScrollX, final int maxOverScrollY, final boolean isTouchEvent)
{
    VerticalOverScrollController.Result result = overscrollController.calcVerticalOverScroll(deltaY, scrollY);
    Log.d("overScrollBy", "scrollY " + result.scrollY + " overScrollY " + result.overScrollY);

    return super.overScrollBy(deltaX, deltaY, scrollX, result.getScrollY(), scrollRangeX, scrollRangeY, maxOverScrollX, result.getOverScrollY(), isTouchEvent);
}

calcVerticalOverScroll

 public Result calcVerticalOverScroll(final int deltaY, final int scrollY)
{
    Result result = new Result();

    if (scrollY <= 0 && deltaY < 0)//if at top and pulling down...
    {
        result.scrollY = (maxTopOverScroll > 0) ? scrollY : 0;
        result.overScrollY = maxTopOverScroll;
    } else
    {
        result.scrollY = (maxBottomOverScroll > 0) ? scrollY : 0;
        result.overScrollY = maxBottomOverScroll;
    }

    return result;
}

结果只是

  public static class Result
{
    int scrollY;
    int overScrollY;

    ... getters()
}

问题是,在 KitKat 之前的任何视图(包括webview)上都非常有效。

在 KitKat 之后,除了 WebView 之外的任何视图都可以完美运行,其中scrollY的日志始终为 0。

关于此版本的 WebView 可能发生的变化有什么想法吗?

如果这不成功,关于如何在 WebView 上正确实现 overScroll 效果的任何想法?

提前致谢。

4

2 回答 2

3

也许这个项目可以帮助你。它目前不支持 WebViews,但很容易扩展,只需几行代码就可以解决您的问题——即通过实现一个专有的过度滚动适配器来适应 Web 视图。应该是这样的:

// First, define an adapter class (this could work as-is, haven't tried it):

public class WebViewOverScrollDecorAdapter implements IOverScrollDecoratorAdapter {

    protected final WebView mWebView;

    public WebViewOverScrollDecorAdapter(WebView view) {
        mWebView = view;
    }

    @Override
    public View getView() {
        return mWebView;
    }

    @Override
    public boolean isInAbsoluteStart() {
        return !mWebView.canScrollVertically(-1);
    }

    @Override
    public boolean isInAbsoluteEnd() {
        return !mWebView.canScrollVertically(1);
    }
}

// Then, apply it over the web-view:

WebView webView = ...;
new VerticalOverScrollBounceEffectDecorator(new WebViewOverScrollDecorAdapter(webView));

如果您设法解决了问题,请考虑将您的代码贡献给 GitHub 上的项目。

于 2015-11-27T15:34:17.490 回答
3

Android 4.4 KitKat (Android 19) 引入了基于 Chromium的新版WebView 。在这个 chromium 浏览器中,他们从 webview 中删除了许多功能。

其中一些错误已报告给 Google。检查链接恢复滚动位置功能在 KitKat 上不起作用

从链接来看,这也是报告的错误之一

在Android 4.4 KitKat上,可能与Chromium WebView有关,回退时没有恢复上一篇文章的滚动位置。

这不是这个问题的确切答案,而只是指出事情。但是在新的 webview 中必须有一个解决方法。让我检查一下并更新我的答案!

于 2015-08-31T10:48:35.427 回答