从 WebView 捕获 HTML 作为图像?

Capture HTML from WebView as an Image?

WebView 有 2 个已弃用的方法,用于将内容捕获为图像:

capturePicture()
setPictureListener()

由于这些已弃用,现在有什么可用于将 webview 内容捕获为图像?

现在这样正确吗:

public void takePicture() {
    WebView webView = new WebView(context);

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            Bitmap b = Bitmap.createBitmap(view.getWidth(), view.getContentHeight(), Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(b);

            view.draw(c);

        }
    });
}

是的,使用WebView.draw()是正确的方法。但是,从 onPageFinished 执行此操作并不能保证实际显示任何内容,因为在加载页面资源时会触发此事件,并且页面可以使用一些实际显示内容的 JS 代码。

正确的方法是使用 PictureListener.onNewPicture() 回调(尽管它已被弃用)。当 WebView 绘制了一些东西时仍然会触发此事件,但正如 documentation 所说,实际上并没有提供图片——为此,您必须调用 WebView.draw().

此外,请注意,如果您的应用面向 L API 级别或更高级别,您需要在创建任何 WebView 之前调用 WebView.enableSlowWholeDocumentDraw() 以使其绘制整个内容WebView 放到 canvas,见 this

在 M 版本中情况会变得更好,其中添加了一个名为 VisualStateListener 的新回调(请参阅 this doc). You can check it out in the preview SDK