您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

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