2

我想在开始时将我的 webview 自动滚动到一个百分比,比如说页面的 3/4。

问题:computeVerticalScrollRange 仅在 webview 完成渲染时才知道。我不知道(并且调查过:我不知道?)webview 何时完成渲染(不是加载,而是渲染所有内容),何时大小(computeVerticalScrollRange)将是完全最终的。

什么不起作用:

  1. 当 computeVerticalScrollRange 仍返回 0 时调用 WebViewClient.onPageFinished。

  2. WebChromeClient.onProgressChanged 100% 在 computeVerticalScrollRange 仍返回 0 时被调用。

  3. PictureListener.onNewPicture 有时被调用得太早,此时 computeVerticalScrollRange 还不是最终的(小于一秒后的值)。

  4. 编辑 HTML,在 window.onload 上放置一个调用 Android 类的 Javascript 处理程序(使用警报)有同样的问题:computeVerticalScrollRange 有时还不是最终的(小于一秒后的值)。

有没有办法从(滚动点)网页的 3/4 开始?

4

2 回答 2

1

如果 computeVerticalScrollRange 发生变化,我实现了每 600 毫秒检查一次(在第一个 PictureListener.onNewPicture 之后)的可怕解决方案。如果此内容大小在过去 600 毫秒内没有改变,我假设网页完成加载,我进行滚动并在屏幕上显示 webview(使其可见)。

可怕:这会使每个页面加载速度减慢 600 毫秒,即使对于只有几行的页面也是如此。

可怕:对于一个非常大的页面,600 毫秒可能还不够,我的应用程序仍然不会滚动。

我仍在寻找一个好的解决方案。

于 2012-09-28T12:23:12.447 回答
0

我所做的是创建一个WebView具有公共方法的自定义computeVerticalScrollRange()

public int getVerticalScrollRange() {
    return super.computeVerticalScrollRange();
}

之后在onPageFinished()调用此方法中:

private void computeWebViewHeight() {
    infoWebView.post(new Runnable() {
        @Override
        public void run() {
            int webViewHeight = customWebView.getVerticalScrollRange();
            // Also have a retryCount max so in case the webView really has a height of 0 you don't have an infinite loop
            if(webViewHeight <= 0 && webViewHeightRetryCount < 10) {
                webViewHeightRetryCount++;
                computeWebViewHeight();
            } else {
                if(webViewHeightRetryCount >= 10) {
                    // RetryCount was above max, so execute fallback
                } else {
                    // WebView has a height, do something with it
                }
                webViewHeightRetryCount = 0;
            }
        }
    });
}

这样你就没有 600 毫秒的延迟。

我已将 retryCount 设置为 10,但它可能有点低,我不太确定。

于 2017-02-08T10:55:15.513 回答