android 当屏幕截图,你如何改变屏幕内容,他们俩bitmap将合并的图像被一起显示
需求项目中遇到。需要截图。方法,如下面的截图
使期望截图此方法activity
/**
* 截图 用于相应activity截图
*
* @param activity
* @return
*/
public Bitmap takeScreenShot(Activity activity) {
View rootView = activity.getWindow().getDecorView();
rootView.setDrawingCacheEnabled(true);
rootView.buildDrawingCache();
Bitmap bitmap = rootView.getDrawingCache();
// 获取状态栏高度
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
// Log.i("TAG", "" + statusBarHeight);
// 获取屏幕长和高 int width = activity.getWindowManager().getDefaultDisplay().getWidth();
int height = activity.getWindowManager().getDefaultDisplay()
.getHeight(); // 去掉标题栏 Bitmap b = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width,
height - statusBarHeight - height / 3 + 100); rootView.setDrawingCacheEnabled(false); return b;
}
可是发现截取的图像有些内容是须要我改动的,比方想要把截图中的标题替换成还有一个样子,原来的activity还不能改动的情况下,仅仅能又一次做一个bitmap,并将此bitmap加入到上面返回的bitmap的对应位置中;例如以下是加入的方法:
<span style="white-space:pre"> </span>// 这是我从资源文件里定义的长度,也可自由设置
<span style="white-space:pre"> float dimension = getResources().getDimension(
<span style="white-space:pre"> </span>R.dimen.activity_action_bar_height);</span>
</pre><pre name="code" class="java">
<span style="white-space:pre"> </span><pre name="code" class="java" style="font-size: 13.3333339691162px;"><span style="white-space:pre"> </span>//conView为自己想要增加的View 是我之前自己写的View用来生成替换的bitmap
<span> </span>conView.setDrawingCacheEnabled(true);
<span> </span>conView.buildDrawingCache();
<span> </span>
<span> </span>Bitmap bitmap3 = conView.getDrawingCache();//这种方法须要注意,往下会说
<span> </span>Bitmap bitmap2 = Bitmap.createBitmap(bitmap3, 0, statusBarHeight,
<span> </span>width, (int) dimension);
int w = bitmap2.getWidth();int h = bitmap2.getHeight();int[] pixels = new int[w * h];bitmap2.getPixels(pixels, 0, w, 0, 0, w, h);
<span style="white-space:pre"> </span> Bitmap b = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width,
height - statusBarHeight - height / 3 + 100);
//
<span style="white-space:pre"> </span>//将生成的bitmap替换原来bitmap中的位置
b.setPixels(pixels, 0, w, width / 5, 0, w, h);
执行结果发现报错,自定义的View生成的bitmap为空。也就是Bitmap bitmap3 = conView.getDrawingCache();返回空。原来是计算conView的bitmap超出了系统内存限制的大小。主要原因是drawingCache的值大于系统给定的值。
我们能够看一下buildDrawingCache()方法中的一段代码:
<span style="line-height: 19.5px; color: rgb(75, 75, 75); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="line-height: 1.5;"></span></span><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-size: 12px; line-height: 18px; font-family: 'Courier New' !important;"><span style="color: rgb(0, 0, 255); line-height: 1.5 !important; font-size: 12px !important;">if</span> (width <= 0 || height <= 0 ||(width * height * (opaque && !translucentWindow ? 2 : 4) ><span style="line-height: 1.5 !important; font-size: 12px !important;"> ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {
destroyDrawingCache();
</span><span style="color: rgb(0, 0, 255); line-height: 1.5 !important; font-size: 12px !important;">return</span><span style="line-height: 1.5 !important; font-size: 12px !important;">;
} </span>
上面的代码中,width和height是所要cache的view绘制的宽度和高度,所以(width * height * (opaque && !translucentWindow ? 2 : 4) 计算的是当前所须要的cache大小。 ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()得到的是系统所提供的最大的DrawingCache的值。当所须要的drawingCache >系统所提供的最大DrawingCache值时,生成Bitmap就会出现故障。此时获取的Bitmap就为null。 所以在仅仅须要改动所需的cache值就能够解决这个问题了。于是我们引入另外一种方法:
public static Bitmap convertViewToBitmap(View view){
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
<span style="line-height: 19.5px; color: rgb(75, 75, 75); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="line-height: 1.5;">
</span></span>
<span style="line-height: 19.5px; color: rgb(75, 75, 75); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="line-height: 1.5;">这样用此方法替换之前用View 生成bitmap的方法就可以</span></span>
版权声明:本文博客原创文章,博客,未经同意,不得转载。
android 当屏幕截图,你如何改变屏幕内容,他们俩bitmap将合并的图像被一起显示的更多相关文章
- Android应用:StatusBar状态栏、NavigationBar虚拟按键栏、ActionBar标题栏、Window屏幕内容区域等的宽高
一.屏幕中各种栏目以及屏幕的尺寸 当我们需要计算屏幕中一些元素的高度时,或许需要先获取到屏幕或者各种栏目的高度,下面这个类包含了Status bar状态栏,Navigation bar虚拟按键栏,Ac ...
- Android自定义视图二:如何绘制内容
这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...
- 使用ajax实现无刷新改变页面内容
如何使用ajax实现无刷新改变页面内容(也就是ajax异步请求刷新页面),下面通过一个小demo说明一下,前端页面代码如下所示 1 <%@ Page Language="C#" ...
- Android学习笔记(十九)——内容提供器
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整 ...
- Java文件编码自动转换工具类(只改变编码,不会改变文件内容)
本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. public class Cha ...
- Android:将View的内容映射成Bitmap转图片导出
前段时间在网上看到这么个例子是将view映射到一个bitmap中,稍加改进可以用于一些截图工具或者截图软件(QQ截图之类),例子写的不够完善,不过很有些学习的意义内容大致如下: 在Android中自有 ...
- 使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- android 布局如何支持多种不同屏幕尺寸
android 布局如何支持多种不同屏幕尺寸 --关于dp.layout-xxx.drawable-xxx作用的小结 转载自:http://blog.csdn.net/vincent_blog/art ...
- HTML DOM 改变 HTML 内容
HTML DOM 允许 JavaScript 改变 HTML 元素的内容. 改变 HTML 输出流 JavaScript 能够创建动态的 HTML 内容: 今天的日期是: Thu Feb 25 201 ...
随机推荐
- vs2012 它已停止工作 - 解决方案
最近学习<Windows多媒体编程>本课程, 蛋疼, 学校原来是MFC... 然后安装vs2012. 后来又在几个插件.. 在这个问题. 开业,提示 vs2012 它已停止工作. wa ...
- Qt国际化相关类
QTextCodec QTextCodec为文本编码之间提供转换. Qt用Unicode 来存储,绘制和操作字符串.在很多情况下你可能希望操作不同编码的数据.例如,大部分日本文档是以Shift-JIS ...
- java线程池的注意事项
java线程池是建立一个技术进步的线程.到来之前线程池打造一批在线程的线程尚未,队列上的备用,然后再利用这些资源.减少频繁创建和销毁对象, 1.jdk1.5以上提供了现成的线程池 2.java线程池的 ...
- 将本地文件上传到指定的服务器(HttpWebRequest方法)
将本地文件上传到指定的服务器(HttpWebRequest方法),通过文件流,带文件名,同文件一同上传的表单文本域及值. ///<summary> /// 将本地文件上传到指定的服务器(H ...
- Eclipse中为什么创建DynamicWebProject后没有默认的web.xml文件?
在Eclipse中新建DynamicWebProject的时候不要直接点"完毕",在下一步有个勾选项(Generate web.xml deployment descriptor) ...
- LoadRunner获取一个独特的价值在执行的场景
/* * * 笔者:古柏涛 * 迄今:2015-2-26 * E-mail:gubotao@foxmail.com * * 内容概要: * 本代码产生一个从1970年1月1日0时開始累计以毫秒为单位的 ...
- Apache+Tomcat部署负载均衡(或集群)
本来只打算写Tomcat集群部署,简化Apache和Tomcat整合过程的.后来想了想,这样不便于没有用过Apache的朋友来学习本文内容.于是干脆加大篇幅,让对Apache不了解的朋友能对Apach ...
- java编程接口(6) ------ 图标
本文提出了自己的学习笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 能够在JLable或者不论什么从AbstractButton继承的组件使用Ic ...
- 输出A打头的字符串
题目描述 输出n个字符串,把其中以字母A打头的字符串输出. 输入 第一行 n 第二行到第n+1行,每行一个字符串 输出 A打头的字符串 样例输入 3 Ada Bob Alice 样例输出 Ada Al ...
- 【程序员小助手】Synergy,感受穿越屏幕之美
内容简介 1.Synergy简介 2.Synergy安装与配置 3.附录 [程序员小助手]系列 在这个系列文章中(不定期更新),小编会把这些年(也没几年)的编程学习和工作中使用到的个人感觉非常好的软件 ...