如题,需求就是把xml里面的布局转换成图片,然后保存下来,大家觉得特别简单吧,去问过好多人,也查了查很多app都有这么一个功能,当用户完成了app的某个任务时,产品希望用户点击分享的时候,能动态绘制出一张图片,让用户的分享的内容更加生动化

思路不复杂,可是实践起来简直太多坑了。

1:获取布局

relativeLayout = (RelativeLayout) findViewById(R.id.layout_rl);

2:设置布局相关设置

// 获取图片某布局relativeLayout.setDrawingCacheEnabled(true);relativeLayout.buildDrawingCache();

3.获取图片

final Bitmap bmp = relativeLayout.getDrawingCache(); // 获取图片savePicture(bmp, "test.jpg");// 保存图片

4:保存图片

public void savePicture(Bitmap bm, String fileName) {Log.i("xing", "savePicture: ------------------------");if (null == bm) {Log.i("xing", "savePicture: ------------------图片为空------");return;}File foder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test");if (!foder.exists()) {foder.mkdirs();}File myCaptureFile = new File(foder, fileName);try {if (!myCaptureFile.exists()) {myCaptureFile.createNewFile();}BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));//压缩保存到本地bm.compress(Bitmap.CompressFormat.JPEG, 90, bos);bos.flush();bos.close();} catch (IOException e) {e.printStackTrace();}Toast.makeText(this, "保存成功!", Toast.LENGTH_SHORT).show();}

5:释放资源

relativeLayout.destroyDrawingCache();

View.getDrawingCache() 只适用于分享的View已经完整展示在用户的屏幕上,还有种情况是需要转化为bitmap的布局没有显示,而需要我们在后台生成btmap,我们只需要获取到屏幕的宽高在view生成图片的时候传进去即可,否则会报空指针的

WindowManager manager = this.getWindowManager();
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
int width = outMetrics.widthPixels;
int height = outMetrics.heightPixels;

假设我当前是在A页面,我要分享出去的B图片和A页面只需要隐藏分享按钮,接下来提供第二种方法,这种方法的做法是:


Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new   Canvas(b);
v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
v.draw(c);
return b;

这里提供一下核心的代码:


/**
* 创建分享的图片文件
*/
public String createShareFile() {    Bitmap bitmap = createBitmap();//将生成的Bitmap插入到手机的图片库当中,获取到图片路径String filePath = MediaStore.Images.Media.insertImage(getContext().getContentResolver(),     bitmap, null, null);    //及时回收Bitmap对象,防止OOMif (!bitmap.isRecycled()) {        bitmap.recycle();    } //转uri之前必须判空,防止保存图片失败if (TextUtils.isEmpty(filePath)) {        return "";    }    return getRealPathFromURI(getContext(), Uri.parse(filePath));
}/**
* 创建分享Bitmap
*/
private Bitmap createBitmap() {  //自定义ViewGroup,一定要手动调用测量,布局的方法  measure(getLayoutParams().width, getLayoutParams().height);    layout(0, 0, getMeasuredWidth(), getMeasuredHeight());//如果图片对透明度无要求,可以设置为RGB_565Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);    Canvas canvas = new Canvas(bitmap);    draw(canvas);   return bitmap;
}private static String getRealPathFromURI(Context context, Uri contentUri) {Cursor cursor = null;    try {        String[] proj = {MediaStore.Images.Media.DATA};        cursor = context.getContentResolver().query(contentUri, proj, null, null, null);       if (cursor == null) {            return "";        }        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);cursor.moveToFirst();        return cursor.getString(column_index);    } finally {        if (cursor != null) {            cursor.close();       }    }
}

在文章的结尾提醒大家一下网络图片需要加载完成后再回调生成图片成功的方法,例如在Glide的RequestListener等。

马上就要过年了,在这里住大家新年快乐!以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

Android笔记:将布局转换成图片相关推荐

  1. Android代码(Handler的运用),HttpURLConnection的应用,将url图片地址转换成图片。

     1 布局文件, <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  2. android base64 转图片,Android 中 Base64 转换成 图片

    场景 项目中有个功能是显示微信付款码,为了节省服务器存储,将图片以Base64的形式存储,客户端接收到后将Base64转换成图片并加载,但是不要存放大图,在网上看到的大多都是使用了一个java库(im ...

  3. Android 中 Base64 转换成 图片

    场景 项目中有个功能是显示微信付款码,为了节省服务器存储,将图片以Base64的形式存储,客户端接收到后将Base64转换成图片并加载,但是不要存放大图,在网上看到的大多都是使用了一个java库(im ...

  4. 将Android布局转成图片,并保存到本地(解决JPEG图片因透明度变黑问题)

    最新碰到个需求,就是将布局转成图片导出,后来想到可以用view.draw(canvas)方法,将布局转为图片. 将布局转为bitmap public Bitmap getBitmap(View vie ...

  5. android开发将h5转换成pdf_如何将PDF转换成图片?搞定PDF格式转换,就用这招就够了!...

    原标题:如何将PDF转换成图片?搞定PDF格式转换,就用这招就够了! 在我们日常学习和日常工作中,我们有时候会遇到要使用到PDF中某一部分的情况,这时候我们可以将PDF文件转成图片.有什么办法可以把P ...

  6. xml文件转换成图片_怎样能把PDF文件转换成图片?

    我们的日常生活工作中时常碰到pdf与Excel.Word.ppt和jpg等文件格式的转换,有时候由于工作的需要,要把PDF文件转换成图片.并且现在网上的很多素材都是PDF文件格式的,如果我们想要里面的 ...

  7. php+打开图片二进制文件,php接收二进制文件转换成图片

    $GLOBALS['HTTP_RAW_POST_DATA'] 最近在做Flash在线裁剪图片 生成图片的东西. 通过Flash POST 图片的二进制数据给php,由php生成图片保存. 开始想到用$ ...

  8. 【RPA机器人】PDF批量转换成图片机器人

    运行前须知: 1.仅支持win10系统 2.请确保安装金山PDF独立版 3.请把屏幕分辨率设置为1920x1080,缩放布局100% 4.生成的图片将保存在所选文件夹目录下 运行流程: 1.获取需批量 ...

  9. pdf怎么转换成图片?学会这几种方法,快速转换

    在日常工作过程中,经常会遇到将pdf文件转换为图片的问题.将PDF文件转换为图片可以提高文件的可视化性和兼容性.由于PDF格式的文件通常包含复杂的布局.图表和图片,有时候在某些设备或软件上无法正确地展 ...

最新文章

  1. Nginx基于IP,端口,域名配置虚拟主机
  2. linux 5.5安装万兆网卡驱动,RedHat 5.5系统下安装MW54U无线USB网卡驱动
  3. VTK:PolyData之TriangleSolidColor
  4. python或运算 和 in_Python’的奇怪行为是’运算符,如果与’in’结合使用[复制]
  5. docker删除本地已下载的镜像
  6. 【安卓开发 】Android初级开发(十)Android中app自动更新版本号比较
  7. java socket发送定长报文_一个基于TCP协议的Socket通信实例
  8. awk处理带有空格的字符串_五分钟入门文本处理三剑客grep awk sed
  9. AttributeError: module 'tensorflow' has no attribute 'Session'
  10. go 302不记录cookie_gin pprof 记录日常操作
  11. Flutter 升级 2.0 填坑指导,带你原地起飞
  12. 部署Zipkin分布式性能追踪日志系统的操作记录
  13. Factory Method 抽象工厂模式(创建型)
  14. 背包九讲----整理+例题
  15. cmdn发布博客(markdowm)
  16. Qt--探讨.exe程序加密
  17. 阿里巴巴python开发面试_在阿里巴巴面试,是什么样的体验?
  18. Module parse failed: Unexpected token (1:0) You may need an appropriate load
  19. 物联网开发笔记(9)- 使用Wokwi仿真MicroPython on ESP32开发板实现温度和湿度检测并使用屏幕显示
  20. 每日一狗 · 比利牛斯山犬

热门文章

  1. oracle db、dba和rdba
  2. 圣杯布局原来这么简单!!
  3. java 随机金额_java_微信随机生成红包金额算法java版,最近几年玩得最疯狂的应该是 - phpStudy...
  4. ipv6 dns修改方法
  5. java 将对象写入链表_在Java中,_____类可用于创建链表数据结构的对象。
  6. 阿里云发布首台云电脑“无影”,传统 PC 已“末路”?
  7. scaner 从外网到内网域渗透
  8. C IN ARM64 汇编基础-变量与表达式-基于The C Programming Language - Second Edition
  9. 多准则决策问题评估方法 | 层次分析法(含代码)
  10. 计算机毕设(附源码)JAVA-SSM快递代收系统