前言: 之前項目用的是原生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;
}