android view 转Bitmap 生成截图
项目中经常会用到分享的功能,有分享链接也有分享图片,其中分享图片有的需要移动端对屏幕内容进行截取分享,说白了就是将view 转成bitmap 再到图片分享,还有一种情况是将不可见的view 转成bitmap ,这种view是没有直接显示在界面上的,需要我们使用inflate 进行创建的view。
第一种
先看通过 DrawingCache 方法来截取普通的view,获取它的视图(Bitmap)。
private Bitmap createBitmap(View view) { view.buildDrawingCache(); Bitmap bitmap = view.getDrawingCache(); return bitmap; }
这个方法适用于view 已经显示在界面上了,可以获得view 的宽高实际大小,进而通过DrawingCache 保存为bitmap。
第二种
但是 如果要截取的view 没有在屏幕上显示完全的,例如要截取的是超过一屏的 scrollview ,通过上面这个方法是获取不到bitmap的,需要使用下面方法,传的view 是scrollview 的子view(LinearLayout)等, 当然完全显示的view(第一种情况的view) 也可以使用这个方法截取。
public Bitmap createBitmap2(View v) { Bitmap bmp = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bmp); c.drawColor(Color.WHITE); v.draw(c); return bmp; }
第三种
还有一种 是view完全没有显示在界面上,通过inflate 转化的view,这时候通过 DrawingCache 是获取不到bitmap 的,也拿不到view 的宽高,以上两种方法都是不可行的。第三种方法通过measure、layout 去获得view 的实际尺寸。
public Bitmap createBitmap3(View v, int width, int height) { //测量使得view指定大小 int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY); int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY); v.measure(measuredWidth, measuredHeight); //调用layout方法布局后,可以得到view的尺寸大小 v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); Bitmap bmp = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bmp); c.drawColor(Color.WHITE); v.draw(c); return bmp; } View view = LayoutInflater.from(this).inflate(R.layout.view_inflate, null, false); //这里传值屏幕宽高,得到的视图即全屏大小 createBitmap3(view, getScreenWidth(), getScreenHeight());
另外写了个简易的保存图片的方法,方便查看效果的。
private void saveBitmap(Bitmap bitmap) { FileOutputStream fos; try { File root = Environment.getExternalStorageDirectory(); File file = new File(root, "test.png"); fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
github地址:https://github.com/taixiang/view2bitmap
欢迎关注我的博客:https://www.manjiexiang.cn/
更多精彩欢迎关注微信号:春风十里不如认识你
一起学习 一起进步
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开源计划之--Android绘图库--LogicCanvas
零、前言: 安卓图形绘制一直以来感觉都很繁琐 在html5时,我用JavaScript封装了一个HTML5的canvas库。 HTML5感觉和Android的canvas挺相似,所以考虑移植过来。 绘图库核心是用配置信息绘图,通过逻辑运算绘图 本篇会持续更新,记录LogicCanvas的成长历程 原理简单示意图: 绘制一个五角星的过程.png 引入 allprojects { repositories { ... maven { url 'https://jitpack.io' } } } implementation 'com.github.toly1994328:logic-canvas-android:0.01' 一、以一个五角星来引入 在自定义View的onDraw方法中:绘制外接圆半径100,内接圆半径50,填充色黄色的5角星 ZCanvas zCanvas = new ZCanvas(canvas); zCanvas.drawNStar( new Painter() .num(5)//角的个数,数字任意 .R(100f)//外接圆半径 .r(50f)////内接圆半径 五角...
- 下一篇
Android面试题库 - Fragment(一) - 基础
Fragment为什么成为第五大组件 Fragment为什么成为第五大组件 四大组件:Activity、Service、Broadcast Receiver、Content Provider Fragment具有生命周期,使用广泛 Fragment加载到Activity的两种方式 xml通过fragment标签引入的方式 code中动态添加 FragmentPagerAdapter和FragmentStatePagerAdapter FragmentPagerAdapter的destroyItem的时候并没有直接销毁item,只是分离了UI FragmentStatePagerAdapter是直接销毁了Fragment Fragment多的时候选择FragmentStatePagerAdapter,少的时候选择FragmentPagerAdapter Fragment的生命周期 Fragment生命周期 Activity生命周期对Fragment生命周期的影响 Framgnet之间的通信 Fragment通过getActivity获取到Activity Fragment实现接口,Act...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Hadoop3单机部署,实现最简伪集群