2025年3月28日 星期五 甲辰(龙)年 月廿七 夜 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

android 截取布局内容并生成图片,截取长图,LinearLayout WebView等皆适用,保存图片到相册,并通知相册更新

时间:02-13来源:作者:点击数:50

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();
  • }
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门