仿微信 把一个view生成图片并保存到手机相册当中(支持刷新相册)

项目里需要生成把一个显示的图片生成图片,然后保存到相册里,并分享到微信,QQ,这里就贴出生成图片的核心代码,不说废话自己看。

1.前后效果图

2.把一个View转成Bitmap:

private Bitmap bmp;
private Bitmap loadBitmapFromView(View v) {
    int w = v.getWidth();
    int h = v.getHeight();

    bmp= Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(bmp);
    c.drawColor(Color.WHITE);
    // 如果不设置canvas画布为白色,则生成透明(我的直接漆黑一片)
    v.layout(0, 0, w, h);
    v.draw(c);
    return bmp;
}

3.保存图片:

private Bitmap cachebmp;//绘画的图片
private Uri contentUri=null; //路径
private String imagePath = "";
private void viewSaveToImage(View view) {
    //缓存
    view.setDrawingCacheEnabled(true);
    //设置组件所使用的绘制缓存的质量:DRAWING_CACHE_QUALITY_HIGH = 0x00100000;
    view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    view.setDrawingCacheBackgroundColor(Color.WHITE);

    // 把一个View转换成图片
    cachebmp = loadBitmapFromView(view);

    FileOutputStream fos = null;
    FileInputStream fis = null;
    BufferedInputStream bis =  null;
    BufferedOutputStream bos = null;

    try {
        // 判断手机设备是否有SD卡
        boolean isHasSDCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
        if (isHasSDCard) {
            // SD卡根目录
            File sdRoot = Environment.getExternalStorageDirectory();
            String savePath = sdRoot+"/baiding/"+UUID.randomUUID().toString()+articleid+".png";
            File file = new File(savePath);
            if(!file.exists()) {
                file.createNewFile();
            }
            fis = new FileInputStream(file);
            bis = new BufferedInputStream(fis);
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            byte[] bi = new byte[1024];
            while(bis.read(bi)!=-1) {
                bos.write(bi);
            }
            imagePath = file.getAbsolutePath();
            //方法1.直接插入图库中的pictrue(优点:一行代码   缺点:不能自定义相册名(自己看了源码,如果哪个大神能自定义相册名的自行忽略这句话))
            // MediaStore.Images.Media.insertImage(getContentResolver(), cachebmp, UUID.randomUUID().toString()+".png", "description");

            //方法2.通过广播直接插到图库(优点:可自定义相册名(我的相册名是“baiding”)   缺点:比方法1多两行代码)
            contentUri = Uri.fromFile(file);
            Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,contentUri);
            sendBroadcast(mediaScanIntent);

        } else {
            throw new Exception("创建文件失败!");
        }
        //压缩图像
        cachebmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        bos.flush();
        fos.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
       try{
           if(bos != null) {
               bos.close();
           }
           if(fos != null) {
               fos.close();
           }
           if(bis != null) {
               bis.close();
           }
           if(fis != null) {
               fis.close();
           }
       }catch (Exception e){

       }
    }
    view.destroyDrawingCache();
    cachebmp.recycle();
    bmp.recycle();
}

4.点击Dialog的确定保存(弹出Dialog都会,所以代码和XML就不贴出了,这里就是最后的使用):

final Dialog_SavePic savePic = new Dialog_SavePic(MyNotesActivity.this);
//1.从数据库中获取用户名
FragmentMeMassage msg = DataUtil.getInstance().getUserInfo(MyNotesActivity.this);
savePic.getNotesFrom().setText("来自"+msg.getNick()+"的分享");
//2.获取标题
savePic.getTittle().setText(bean.getBookMarkTitle());
//3.获取具体内容
idgestContent=bean.getDigestContent();
savePic.getTvContent().setText(idgestContent);
//4.创建的时间
savePic.getOnCreate().setText(bean.getCreateTime());
//5.绘制的控件内容
savePic.setRelativeLayout(publicLl);//publicLl是Dialog里除了取消和确定之外的内容(不知道的看一下上面的示例图)
savePic.show();

savePic.tvTrue.setOnClickListener(new View.OnClickListener() {//点击确定
    @Override
    public void onClick(View v) {
        MyPermission();//6.0+的权限
        viewSaveToImage(savePic.getNoteRelative());//保存图片到相册
        SharePOP();// 微信和QQ的分享
        savePic.dismiss();
    }
});

savePic.setOnDismissListener(new DialogInterface.OnDismissListener() {//监听消失
    @Override
    public void onDismiss(DialogInterface dialog) {
        savePic.dismiss();
    }
});

5.    6.0+的权限:

扫描二维码关注公众号,回复: 2792704 查看本文章
private void MyPermission(){
    if (Build.VERSION.SDK_INT>=23){
        String [] permissions={Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
        ActivityCompat.requestPermissions(this,permissions,PERMISSION);
    }
}

6.欢迎指正。




猜你喜欢

转载自blog.csdn.net/qq_41873558/article/details/80943085