天天看點

原生WebView長截圖 和 Tencent x5webview截長圖

前言: 之前項目用的是原生webview,最近使用公司新架構使用的是x5的webview;正好有需求需要做長截圖,踩坑之路開始。

1、原生WebView長截圖

Android5.0及以上版本,Android對WebView進行了優化,為了減少記憶體使用和提高性能,使用WebView加載網頁時隻繪制顯示部分。如果我們不做處理,仍然使用上述代碼截圖的話,就會出現隻截到螢幕内顯示的WebView内容,其它部分是空白的情況。

這時候,我們通過調用WebView.enableSlowWholeDocumentDraw()方法可以關閉這種優化,但要注意的是,該方法需要在WebView執行個體被建立前就要調用,否則沒有效果。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        android.webkit.WebView.enableSlowWholeDocumentDraw();
    }
           
/**
     * 原生WebView長截圖
     *
     * @param webView
     * @return
     */
    public static Bitmap getWebViewBtpBase64Str(WebView webView) {
        Bitmap bitmap = null;
        try {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                Picture snapShot = webView.capturePicture();
                bitmap = Bitmap.createBitmap(snapShot.getWidth(), snapShot.getHeight(), Bitmap.Config.RGB_565);
                Canvas canvas = new Canvas(bitmap);
                snapShot.draw(canvas);
            } else {
                float scale = webView.getScale();
                //得到縮放後webview内容的高度
                int webViewHeight = (int) (webView.getContentHeight() * scale);
                bitmap = Bitmap.createBitmap(webView.getWidth(), webViewHeight, Bitmap.Config.RGB_565);
                Canvas canvas = new Canvas(bitmap);
                //繪制
                webView.draw(canvas);
            }
            return bitmap;
        } catch (OutOfMemoryError e) {
            LogEx.e("ScreenUtils", e.getMessage(), e);
        } catch (Exception e) {
            LogEx.e("ScreenUtils", e.getMessage(), e);
        } finally {
        }
        return "";
    }
           

2、Tencent x5webview截長圖

/**
     * Tencent x5webview截長圖
     *
     * @param webView
     * @return
     */
    public static Bitmap getX5WebViewBtpBase64Str(WebView webView) {
        if (webView == null) {
            return null;
        }
        int wholeWidth = webView.getContentWidth();
        int wholeHeight = webView.getContentHeight();
        Bitmap x5bitmap = Bitmap.createBitmap(wholeWidth, wholeHeight, Bitmap.Config.RGB_565);
        Canvas x5canvas = new Canvas(x5bitmap);
//        x5canvas.scale((float) wholeWidth / (float) webView.getContentWidth(), (float) wholeHeight / (float)webView.getContentHeight());
        if (webView.getX5WebViewExtension() == null) {
            return null;
        }
        IX5WebViewExtension ix5WebViewExtension = webView.getX5WebViewExtension();
        ix5WebViewExtension.snapshotWholePage(x5canvas, false, false);
        Bitmap bitmap = Bitmap.createBitmap(x5bitmap);
        return bitmap;
    }