android 截取布局内容并生成图片,截取长图,LinearLayout WebView等皆适用,保存图片到相册,并通知相册更新
时间:02-13来源:作者:点击数:
1.截图布局(控件)内容并生成Bitmap
/**
* 截取viewGroup长图(viewGroup整个内容区域大小)
* 并保存到本地相册 通知相册更新
* 在setContentView()前判断
* if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
* WebView.enableSlowWholeDocumentDraw();
* }
* @param viewGroup 需要截取内容的容器
* @param fileName 保存到本地的文件命名
* @return 保存图片文件路径
*/
public static String captureWebView(Context context, ViewGroup viewGroup, String fileName) {
String filePath="";
//重新调用WebView的measure方法测量实际View的大小(将测量模式设置为UNSPECIFIED模式也就是需要多大就可以获得多大的空间)
viewGroup.measure(View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
//调用layout方法设置布局(使用新测量的大小)
viewGroup.layout(0, 0, viewGroup.getMeasuredWidth(), viewGroup.getMeasuredHeight());
//开启WebView的缓存(当开启这个开关后下次调用getDrawingCache()方法的时候会把view绘制到一个bitmap上)
viewGroup.setDrawingCacheEnabled(true);
//强制绘制缓存(必须在setDrawingCacheEnabled(true)之后才能调用,否者需要手动调用destroyDrawingCache()清楚缓存)
viewGroup.buildDrawingCache();
//根据测量结果创建一个大小一样的bitmap
Bitmap picture = Bitmap.createBitmap(viewGroup.getMeasuredWidth(),
viewGroup.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
//已picture为背景创建一个画布
Canvas canvas = new Canvas(picture); // 画布的宽高和 WebView 的网页保持一致
Paint paint = new Paint();
//设置画笔的定点位置,也就是左上角
canvas.drawBitmap(picture, 0, viewGroup.getMeasuredHeight(), paint);
//将webview绘制在刚才创建的画板上
viewGroup.draw(canvas);
if (null != picture) {
filePath= saveImageToGallery(context, picture,fileName,false);
return filePath;
} else {
ToastUtils.showShort("出错啦!");
return filePath;
}
}
2.保存图片到相册,并通知相册更新
/**
* 保存Bitmap格式图片到系统文件夹
* 并提醒系统图库更新
* @param context
* @param bmp
* @param fileName 图片文件名 用以提醒系统图库更新
* @return filePath 图片文件的完整路径
*
*/
public static String saveImageToGallery(Context context, Bitmap bmp, String fileName, boolean isNotify) {
// 首先保存图片
File appDir = new File(Constant.WALLPAPER_IMAGE_PATH);
if (!appDir.exists()){
appDir.mkdir();
Log.e(TAG, "saveImageToGallery:文件夹不存在 "+appDir.getPath() );
return "";
}
// String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir,fileName);
if (!file.exists()){
ToastUtils.showShort("文件不存在");
Log.e(TAG, "saveImageToGallery:文件不存在 "+file.getPath() );
try {
file.createNewFile();
} catch (IOException e) {
// Log.e("123456", "saveImageToGallery:0 "+e.toString() );
e.printStackTrace();
}
return "";
}
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
Log.e(TAG, "saveImageToGallery1: "+e.toString() );
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG, "saveImageToGallery2: "+e.toString() );
e.printStackTrace();
}
// 最后通知图库更新
if (isNotify){
// 其次把文件插入到系统图库
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
Log.e(TAG, "saveImageToGallery3: "+e.toString() );
e.printStackTrace();
return "";
}
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + fileName)));
}
return file.getPath();
}