2

我希望我的 webview 自动滚动。以下是我尝试过的,它确实滚动了 webview,但它永远不会停止,即即使在 webview 没有要显示的内容之后它也会继续,所以它只显示白屏。请告诉我如何修复它。

webview.setPictureListener(new PictureListener() {

                public void onNewPicture(WebView view, Picture picture) {
                    webview.scrollBy(0, 1);

                }
            });
4

3 回答 3

1

试试我的代码,希望它有帮助:) 向下滚动:

            mWebView.post(new Runnable() {
            public void run() {
                if (mWebView.getContentHeight() * mWebView.getScale() >= mWebView.getScrollY() ){
                    mWebView.scrollBy(0, (int)mWebView.getHeight());
                }
            }
        });

向上滑动

mWebView.post(new Runnable() {
            public void run() {
                if (mWebView.getScrollY() - mWebView.getHeight() > 0){
                    mWebView.scrollBy(0, -(int)mWebView.getHeight());
                }else{
                    mWebView.scrollTo(0, 0);
                }
            }
        });
于 2014-06-09T20:25:36.037 回答
1

据我所知,与现代 Android 保持一致的唯一方法是使用 JavaScript:

    webView.webViewClient = object : WebViewClient() {
        override fun onPageFinished(view: WebView?, url: String?) {
            webView.evaluateJavascript("""
                |var _fullScrollIntervalID = setInterval(function() {
                |    if (window.scrollY + window.innerHeight >= document.body.scrollHeight) {
                |        window.clearInterval(_fullScrollIntervalID);
                |    } else {
                |        window.scrollBy(0, 10);
                |    }
                |}, 17);
            """.trimMargin(), null)
        }
    }

JavaScript API 知道内容的大小。

此解决方案不考虑更改视口大小、window.innerHeight舍入误差、如果document.body不是滚动元素等。


至于基于 Java 的解决方案,Java API 似乎给出了视图的大小,而不是页面的长度:

  • 高度
  • 内容高度
  • 测量高度
  • 底部

也许这在enableSlowWholeDocumentDraw引入时发生了变化。

一种知道页面内容长度的 Java API 是,但它在调用canScrollVertically后的短时间内返回 false 。onPageFinished您可以使用某种延迟来解决此问题。例如:

    webView.webViewClient = object : WebViewClient() {
        override fun onPageFinished(view: WebView?, url: String?) {
            ScrollRunnable().run()
        }
    }

// ...

val h = Handler()
inner class ScrollRunnable() : Runnable {
    override fun run() {
        // introduce some delay here!
        if (webView.canScrollVertically(1)) {
            webView.scrollBy(0, 10)
            h.postDelayed(this, 17L)
        }
    }
}

我在 Android API26 模拟器和 Android TV API 22 模拟器上对此进行了测试。

于 2018-03-22T23:15:08.023 回答
1

此代码适用于自动滚动以及滚动下降然后自动回到顶部然后再次开始滚动。检查是否有任何查询更新我。

Timer repeatTask = new Timer();
       repeatTask.scheduleAtFixedRate(new TimerTask() {
             @Override
             public void run() {
                   runOnUiThread(new Runnable() {
                    @Override
                     public void run() {
                          int height = (int) Math.floor(webView.getContentHeight() * webView.getScale());
                          int webViewHeight = webView.getMeasuredHeight();
                               if (webView.getScrollY() + webViewHeight >= height) {
                                      webView.scrollBy(0, 0);
                                      webView.scrollTo(0, 0);
                                  } else {
                                       webView.scrollBy(webView.getTop(), webView.getBottom());
                                  }
                               }
                 });
          }
}, 0, 5000);//delayed auto scroll time
于 2016-04-16T07:27:27.417 回答