Android 自动滚动Webview

Android 自动滚动Webview,android,webview,scroll,autoscroll,Android,Webview,Scroll,Autoscroll,我想让我的网络视图自动滚动。下面是我尝试过的,它确实会滚动webview,但不会停止,即即使webview没有可显示的内容,它也会继续,因此它只显示白色屏幕。请告诉我怎么修理 webview.setPictureListener(new PictureListener() { public void onNewPicture(WebView view, Picture picture) { webview.scrollBy

我想让我的网络视图自动滚动。下面是我尝试过的,它确实会滚动webview,但不会停止,即即使webview没有可显示的内容,它也会继续,因此它只显示白色屏幕。请告诉我怎么修理

webview.setPictureListener(new PictureListener() {

                public void onNewPicture(WebView view, Picture picture) {
                    webview.scrollBy(0, 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);
                }
            }
        });

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

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

据我所知,在现代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知道内容的大小

如果
document.body
不是滚动元素等,此解决方案不考虑更改视口大小


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

  • 高度
  • 内容高度
  • 测量高度
  • 底部
也许这一点在引入时有所改变

一个Java API知道页面的内容长度,但在调用
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)
        }
    }
}
我在安卓API26模拟器和安卓TV API 22模拟器上进行了测试