【问题标题】:How to capture a webview to bitmap in Android?如何在 Android 中将 webview 捕获到位图?
【发布时间】:2014-01-03 09:17:02
【问题描述】:

我有一个 webview,我需要向下滚动才能查看所有内容。现在,我想捕获整个 webview 到位图。

我找了很多次。人们建议我使用函数capturePicture()。但是,此功能已弃用。那么,我还可以使用哪些其他方法来实现我的目标?

谢谢大家。

【问题讨论】:

    标签: android webview capture


    【解决方案1】:

    Android L,您需要在创建任何 WebView 之前调用 WebView.enableSlowWholeDocumentDraw()。也就是说,如果您的布局中有任何 WebView,请确保在 onCreate() 中调用 setContentView() 之前调用此方法。
    链接Mikhail Naganov:https://stackoverflow.com/a/30084485/703225

    @Override
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            WebView.enableSlowWholeDocumentDraw();
        }
        ...
        setContentView(layout);
        ...
        ...
    }
    

    然后:

    /**
     * WevView screenshot
     * 
     * @param webView
     * @return
     */
    public static Bitmap screenshot(WebView webView, float scale11) {
        try {
            float scale = webView.getScale();
            int height = (int) (webView.getContentHeight() * scale + 0.5);
            Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(), height, Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            webView.draw(canvas);
            return bitmap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    

    如果你不使用 webView.getScale(),还有:

    public static Bitmap screenshot2(WebView webView) {
        webView.measure(MeasureSpec.makeMeasureSpec(
                        MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED),
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        webView.layout(0, 0, webView.getMeasuredWidth(), webView.getMeasuredHeight());
        webView.setDrawingCacheEnabled(true);
        webView.buildDrawingCache();
        Bitmap bitmap = Bitmap.createBitmap(webView.getMeasuredWidth(),
                webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        int iHeight = bitmap.getHeight();
        canvas.drawBitmap(bitmap, 0, iHeight, paint);
        webView.draw(canvas);
        return bitmap;
    }
    

    【讨论】:

    • 您好,感谢您的帮助。当我调试时,'webView.draw(canvas);'这条线需要 3 秒。有没有办法使用这条线?当我删除这一行时,我得到了一个空白页。
    • 对不起,我不知道。 :-( 页面太大了?
    • 我在我的 Pixel 3a 上使用 Android 11 成功地使用了这个答案,而无需调用 enableSlowWholeDocumentDraw。谢谢!!
    【解决方案2】:

    我找到了解决方案。看看这个。

    我使用 onDraw 替换了 API 19 中已弃用的 capturePicture 函数。如果您有更好的解决方案,请告诉我,我很感激。谢谢!

    Which can replace capturePicture function

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-20
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      相关资源
      最近更新 更多