普通的webview:
public static Bitmap shotWebView( WebView webView, ImageView imageView) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Android5.0以上 float scale = webView.getScale(); int width = webView.getWidth(); int height = (int) (webView.getContentHeight() * scale + 0.5); final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); webView.draw(canvas); // 保存图片 Log.d("bitmap888--","45"+bitmap.getByteCount()); savePicture(webView.getContext(), bitmap); return bitmap; } else { // Android5.0以下 Picture picture = webView.capturePicture(); int width = picture.getWidth(); int height = picture.getHeight(); if (width > 0 && height > 0) { Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); picture.draw(canvas); // 保存图片 savePicture(webView.getContext(), bitmap); return bitmap; } return null; } } catch (OutOfMemoryError oom) { return null; } }
注:捕捉oom实际没有意义,可以通过降低图片质量(RGB_565),也可以截取截图高度,防止图片过高(下面x5webview中截取一半)等方法来防止oom
x5webview:
private Bitmap captureWebView(X5WebView webView) { int wholeWidth = webView.computeHorizontalScrollRange(); int wholeHeight = webView.computeVerticalScrollRange(); wholeHeight=wholeHeight/2;//高度截取一半,防止oom,后面可以指定高度,缩放进行换算 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()/2))); if ( webView.getX5WebViewExtension() == null) { return null; } webView.getX5WebViewExtension().snapshotWholePage(x5canvas, false, false, new Runnable() { @Override public void run() { //拿到x5bitmap之后的业务逻辑,(如果不在线程里操作,return 拿到的x5bitmap,不稳定,实际加载bitmap的时候时有时无,但是在线程里操作就没这个问题) } }); return x5bitmap; }
注:重点是这个线程,因为网上大部分的方法在使用snapshotWholePage的时候都是用的上面三个参数的方法(网上和tx都没有snapshotWholePage相关的api)。