android view转Bitmap生成截图的方法
作者:程序猿tx 发布时间:2022-11-07 13:41:53
标签: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://segmentfault.com/a/1190000016241822


猜你喜欢
- rocketmq消费者注册监听有两种模式有序消费MessageListenerOrderly和并发消费MessageListenerConc
- 具体代码如下所示:public class Parent { public static int a = parentStati
- 依赖<dependency> <groupId>io.springfox</groupId> <a
- 注解说明使用注解: @PostConstruct效果:在Bean初始化之后(构造方法和@Autowired之后)执行指定操作。经常用在将构造
- 本文实例讲述了Android图片处理的方法。分享给大家供大家参考,具体如下:package cn.szbw.util;import Andr
- 一、Hash加密,使用HashAlgorithm哈希算法类的派生类(MD5、SHA1等)特点:只能加密,不可逆。可对目标信息生成一段特定长度
- 为什么会有常量池的概念?不知道小伙伴们是否有思考过这个问题? 没有思考也无所谓,小编在这里类比一下,大家就会清晰了。什么是池? 我们听的最多
- C#的FileInfo类提供了与File类相同的功能,不同的是FileInfo提供的都是成员方法,使用示例如下所示:1、读文件://创建只读
- 起因unity程序build到pc上,拿到其他人的机器上结果有些功能不正常,看log里面大概是Fallback handler could
- 背景:在写登录界面时,老板就觉得在输入密码的时候谈出来的输入法软键盘把登录按钮遮挡住了(入下图所示,不爽),连输入框都被挡了一半
- 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还
- 与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流。本文将简单讲解条件、循环和switch。一、块作用域块(block),即复
- 关于用户token处理到的坑当采用前后台完全分离,以微服务架构的搭建时。在搭建微服务过程中,由于每个服务都是独立的应用,这样就会造成一个统一
- 一、国际化准备资源文件,资源文件的命名格式如下:baseName_language_country.propertiesbaseName_l
- 一个Maprduce程序主要包括三部分:Mapper类、Reducer类、执行类。Maven项目下所需依赖<dependencies&
- 在PDF文档中,图层可以使部分内容选择性地被隐藏或显示。通过添加图层,我们可以将文本、图片、表格等元素精确定位于页面指定位置,并可将这些元素
- 目录功能使用类 SuperAdapter 的作用类 AbsViewHolder 的作用Sample这个适配器我珍藏已久(近两年), 不断看到
- 1. 下载myeclipse版本对应的STS插件下载地址:https://spring.io/tools/sts/all2.在myeclip
- 本文实例讲述了C#中timer定时器用法。分享给大家供大家参考。具体如下:下面的代码通过Timer定时器每隔1000毫秒(1秒)触发一次事件
- 摘要本文主要讲解mall整合SpringTask的过程,以批量修改超时订单为例。SpringTask是Spring自主研发的轻量级定时任务工