最近项目有个 webView 里面截图的需求。记录一下。
// 获取根视图
View dView = context.getWindow().getDecorView();
// 启用绘图缓存
dView.setDrawingCacheEnabled(true);
// 调用缓存
dView.buildDrawingCache();
Bitmap bitmap = Bitmap.createBitmap(dView.getDrawingCache());
// 获取内置SD卡路径
String sdCardPath = Environment.getExternalStorageDirectory().getPath();
// 图片文件路径
Calendar calendar = Calendar.getInstance();
String creatTime = calendar.get(Calendar.YEAR) + "-" +
calendar.get(Calendar.MONTH) + "-"
+ calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE);
String filePath = sdCardPath + File.separator + "shot_" + creatTime + ".png";
if (bitmap != null) {
try {
File file = new File(filePath);
FileOutputStream os = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
os.flush();
os.close();
XjjLogManagerUtil.d(TAG, "存储完成");
} catch (Exception e) {
e.printStackTrace();
}
}
通过上述代码截图后,发现一个问题。webView 里面截图的一些图片是没有显示的。在网上查了一下,需要在 webView 的 xml 布局文件里面加上一行属性设置
android:layerType="software"
<WebView
android:id="@+id/webView"
android:layerType="software"
android:layout_width="match_parent"
android:layout_height="match_parent" />
这样子就能够正常截图了。webView 中的图片也能正常在截图中显示出来了。
然而又发现了一个问题,就是每次在同一个 webView 中截图,保存的图片永远是第一张图片,初步猜测是因为缓存问题,于是换了种截图方式
//获取webview缩放率
float scale = webView.getScale();
//得到缩放后webview内容的高度
int webViewHeight = (int) (webView.getContentHeight()*scale);
Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(),webViewHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
//绘制
webView.draw(canvas);
发现从 webView 获取的截图,有时候会有一大段空白。所以又改成了从 decorView 中获取当前屏幕。
View decorView = getContext().getWindow().getDecorView();
Bitmap bitmap = Bitmap.createBitmap(decorView.getWidth(), decorView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
//绘制
decorView.draw(canvas);
这样子截图功能最终就做好了。缺点就是把标题栏也给带进去了。但能保证截图的是 webView 当前显示的全部内容。 所以最终代码是
View decorView = getContext().getWindow().getDecorView();
Bitmap bitmap = Bitmap.createBitmap(decorView.getWidth(), decorView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
//绘制
decorView.draw(canvas);
// 获取内置SD卡路径
String sdCardPath = Environment.getExternalStorageDirectory().getPath();
// 图片文件路径
Calendar calendar = Calendar.getInstance();
String creatTime = calendar.get(Calendar.YEAR) + "-" +
calendar.get(Calendar.MONTH) + "-"
+ calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE) + ":"
+ calendar.get(Calendar.SECOND);
String filePath = sdCardPath + File.separator + "shot_" + creatTime + ".png";
if (bitmap != null) {
try {
File file = new File(filePath);
if (file.exists()) {
file.delete();
}
FileOutputStream os = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
os.flush();
os.close();
XjjLogManagerUtil.d(TAG, "存储完成");
} catch (Exception e) {
e.printStackTrace();
}
}
网友评论