仿微信 把一个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+的权限:
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.欢迎指正。