直接上代码了 稳稳的 屏幕外也可以实现截取 public static void getViewBitmap(View view) { WebView webview = (WebView) view; //测量webview 实际的大小 包括屏幕外的 webview.measure(View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); webview.layout(0, 0, webview.getMeasuredWidth(), webview.getMeasuredHeight()); //启用View的DrawingCache功能 webview.buildDrawingCache(true); webview.setDrawingCacheEnabled(true); webview.setVerticalScrollBarEnabled(false); webview.buildDrawingCache(); // 延时保存图片 必须延时不然会出现截取部分白屏 new Handler().postDelayed(() -> { Bitmap bitmap =convertViewToBitmap(webview, webview.getMeasuredWidth(), webview.getMeasuredHeight()); Canvas canvas = new Canvas(bitmap); // 画布的宽高和 WebView 的网页保持一致 Paint paint = new Paint(); canvas.drawBitmap(bitmap, 0, webview.getMeasuredHeight(), paint); webview.draw(canvas); try { //保存bitmap 为本地图片或做其他处理 saveFile(webview, bitmap); } catch (IOException e) { e.printStackTrace(); } }, 500); }
/** * 绘制view的bitmap * @param view 要绘制的view * @param bitmapWidth 绘制宽 传入实际宽高 * @param bitmapHeight 绘制高 * @return */ private static Bitmap convertViewToBitmap(View view, int bitmapWidth, int bitmapHeight) { Bitmap bitmap = null; try { bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_4444); view.draw(new Canvas(bitmap)); } catch (OutOfMemoryError ooe) { System.gc(); return bitmap; } return bitmap; }
注意事项 : 1.webview 在截取完成后 会失去焦点 不能在滚动了 (处理方法:reload 或手动滚动webview)
2.webview 会截取不到部分三方框架绘制的图 (可转换成image 后在进行截取)
3. 获取图片后 切记 执行webview.buildDrawingCache(false);