自动滚动Webview

时间:2013-08-11 04:29:38

标签: android webview scroll autoscroll

我希望我的webview能够自动滚动。下面是我尝试过的,它会滚动webview但它永远不会停止,即使在webview没有内容显示之后它仍然继续,所以它只显示白色屏幕。请告诉我怎么修好。

webview.setPictureListener(new PictureListener() {

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

                }
            });

3 个答案:

答案 0 :(得分:0)

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

            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);
                }
            }
        });

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

据我所知,与现代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 rounding errors,如果document.body不是滚动元素等等。

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

  • 高度
  • 或contentHeight
  • measuredHeight可以

引入enableSlowWholeDocumentDraw时,可能会发生这种情况。

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

    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模拟器上进行了测试。