据我所知,与现代 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 模拟器上对此进行了测试。