Android:如何在Nougat(Android 7)中对整个WebView进行截屏

5
我使用下面的代码从WebView中截取屏幕截图。在Android 6及以下版本中表现良好,但在Android 7中只能截取可见部分。
// before setContentView
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            WebView.enableSlowWholeDocumentDraw();
        }
...
// before set webview url
webView.setDrawingCacheEnabled(true);
// after html load complete
final Bitmap b = Bitmap.createBitmap(webView.getMeasuredWidth(),
                webView.getContentHeight(), Bitmap.Config.ARGB_8888);
        Canvas bitmapHolder = new Canvas(b);
        webView.draw(bitmapHolder);

但是位图b不完整。在Android Nougat中,我如何拍摄整个WebView的屏幕截图?

编辑:
我发现webView.getContentHeight无法正常工作。我硬编码了整个webview的高度,并且它可以很好地工作。所以问题是:我如何在Android Nougat中获取整个WebView内容的高度?

2个回答

4

使用以下方法代替getMeasuredWidth()和getContentHeight()方法:

computeHorizontalScrollRange(); -> for width 
computeVerticalScrollRange(); -> for height

这两种方法将返回整个可滚动的宽度/高度,而不是屏幕上WebView实际的宽度/高度。

为了实现这一点,您需要将 WebView 的 getMeasuredWidth() 和 getContentHeight() 方法设置为公共方法,如下所示:

public class MyWebView extends WebView
{
    public MyWebView(Context context)
    {
        super(context);
    }

    public MyWebView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public MyWebView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public int computeVerticalScrollRange()
    {
        return super.computeVerticalScrollRange();
    }

}

在其他情况下,您还可以使用视图树观察器来计算 WebView 的高度,如此 答案 所示。


computeVerticalScrollRange() has protected access in android.webkit.WebView - Mneckoee
这对您有帮助吗?@YaHoo - King of Masses

0

删除下面的代码块

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        WebView.enableSlowWholeDocumentDraw();
    }

禁用整个HTML文档会带来显著的性能代价。

根据文档,

对于针对L版本的应用程序,WebView有一个新的默认行为,通过智能选择需要绘制的HTML文档部分,减少内存占用并提高性能。

值得研究一下 this

对于编辑1的回答:

在渲染后检索webview高度

https://dev59.com/RGAh5IYBdhLWcg3wDfoW#22878558

我已经注释掉它并且再次尝试,但问题仍然存在。这行代码对于Android L是必要的。 - Mneckoee
我已经更新了答案,请参考 https://dev59.com/oYrda4cB1Zd3GeqPRdJO - Mani
我的问题不在Android L上,而是在Android N(牛轧糖,7)上。 - Mneckoee
相同的解决方案也适用于针对 Android L 及以上版本的应用程序。 - Mani
我编辑了这个问题。webView.getContentHeight 不太好用。它返回的是可见部分的高度。 - Mneckoee
鼓励您在提问之前先搜索SO。 - Mani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接