需求项目中遇到。需要截图。方法,如下面的截图

使期望截图此方法activity

  1. /**
  2. * 截图 用于相应activity截图
  3. *
  4. * @param activity
  5. * @return
  6. */
  7. public Bitmap takeScreenShot(Activity activity) {
  8. View rootView = activity.getWindow().getDecorView();
  9. rootView.setDrawingCacheEnabled(true);
  10. rootView.buildDrawingCache();
  11. Bitmap bitmap = rootView.getDrawingCache();
  12. // 获取状态栏高度
  13. Rect frame = new Rect();
  14. activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
  15. int statusBarHeight = frame.top;
  16. // Log.i("TAG", "" + statusBarHeight);
  17. // 获取屏幕长和高
  18.  
  19. int width = activity.getWindowManager().getDefaultDisplay().getWidth();
  20. int height = activity.getWindowManager().getDefaultDisplay()
  21. .getHeight();
  22.  
  23. // 去掉标题栏
  24.  
  25. Bitmap b = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width,
  26. height - statusBarHeight - height / 3 + 100);
  27.  
  28. rootView.setDrawingCacheEnabled(false);
  29.  
  30. return b;
  31. }

可是发现截取的图像有些内容是须要我改动的,比方想要把截图中的标题替换成还有一个样子,原来的activity还不能改动的情况下,仅仅能又一次做一个bitmap,并将此bitmap加入到上面返回的bitmap的对应位置中;例如以下是加入的方法:

  1. <span style="white-space:pre"> </span>// 这是我从资源文件里定义的长度,也可自由设置
  1. <span style="white-space:pre"> float dimension = getResources().getDimension(
  2. <span style="white-space:pre"> </span>R.dimen.activity_action_bar_height);</span>
  1. </pre><pre name="code" class="java">
  1. <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
  2. <span> </span>conView.setDrawingCacheEnabled(true);
  3. <span> </span>conView.buildDrawingCache();
  4. <span> </span>
  5. <span> </span>Bitmap bitmap3 = conView.getDrawingCache();//这种方法须要注意,往下会说
  6. <span> </span>Bitmap bitmap2 = Bitmap.createBitmap(bitmap3, 0, statusBarHeight,
  7. <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);

  1.  
  1. <span style="white-space:pre"> </span>
  2.  
  3. Bitmap b = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width,
  4. height - statusBarHeight - height / 3 + 100);
  5. //
  1. <span style="white-space:pre"> </span>//将生成的bitmap替换原来bitmap中的位置
  2. b.setPixels(pixels, 0, w, width / 5, 0, w, h);

执行结果发现报错,自定义的View生成的bitmap为空。也就是Bitmap bitmap3 = conView.getDrawingCache();返回空。原来是计算conView的bitmap超出了系统内存限制的大小。主要原因是drawingCache的值大于系统给定的值。

我们能够看一下buildDrawingCache()方法中的一段代码:

  1. <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())) {
  2. destroyDrawingCache();
  3. </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;">;
  4. } </span>
  1. 上面的代码中,widthheight是所要cacheview绘制的宽度和高度,所以(width * height * (opaque && !translucentWindow ?
  2.  
  3. 2 : 4) 计算的是当前所须要的cache大小。
  4.  
  5. ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()得到的是系统所提供的最大的DrawingCache的值。当所须要的drawingCache >系统所提供的最大DrawingCache值时,生成Bitmap就会出现故障。此时获取的Bitmap就为null 所以在仅仅须要改动所需的cache值就能够解决这个问题了。于是我们引入另外一种方法:
  1.  

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;

}

  1.  
  1. <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;">
  2. </span></span>
  1. <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将合并的图像被一起显示的更多相关文章

  1. Android应用:StatusBar状态栏、NavigationBar虚拟按键栏、ActionBar标题栏、Window屏幕内容区域等的宽高

    一.屏幕中各种栏目以及屏幕的尺寸 当我们需要计算屏幕中一些元素的高度时,或许需要先获取到屏幕或者各种栏目的高度,下面这个类包含了Status bar状态栏,Navigation bar虚拟按键栏,Ac ...

  2. Android自定义视图二:如何绘制内容

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  3. 使用ajax实现无刷新改变页面内容

    如何使用ajax实现无刷新改变页面内容(也就是ajax异步请求刷新页面),下面通过一个小demo说明一下,前端页面代码如下所示 1 <%@ Page Language="C#" ...

  4. Android学习笔记(十九)——内容提供器

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整 ...

  5. Java文件编码自动转换工具类(只改变编码,不会改变文件内容)

    本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. public class Cha ...

  6. Android:将View的内容映射成Bitmap转图片导出

    前段时间在网上看到这么个例子是将view映射到一个bitmap中,稍加改进可以用于一些截图工具或者截图软件(QQ截图之类),例子写的不够完善,不过很有些学习的意义内容大致如下: 在Android中自有 ...

  7. 使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. android 布局如何支持多种不同屏幕尺寸

    android 布局如何支持多种不同屏幕尺寸 --关于dp.layout-xxx.drawable-xxx作用的小结 转载自:http://blog.csdn.net/vincent_blog/art ...

  9. HTML DOM 改变 HTML 内容

    HTML DOM 允许 JavaScript 改变 HTML 元素的内容. 改变 HTML 输出流 JavaScript 能够创建动态的 HTML 内容: 今天的日期是: Thu Feb 25 201 ...

随机推荐

  1. android平台TextView使用ImageSpan画廊GIF图像

    android-gif-drawable(https://github.com/koral--/android-gif-drawable/releases)开源项目---是一个蛮不错的android ...

  2. Android如何获得手机power_profile.xml文件

    上的能量消耗进行最近的测试,阅读文章一个月,最后,我们发现了一些新的想法,但产生的问题.那 工作无法再进行下去. 在Android手机中,对于手机中的每一个部件(cpu.led.gps.3g等等)执行 ...

  3. ZOJ--3631--Watashi&#39;s BG【枚举】

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4777 题意:有n天,告诉你每天的花费,别人给你一笔资金m,你自己也有一部 ...

  4. 从字节码层面看“HelloWorld” (转)

    一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...

  5. PM俱乐部之旅7-弱活着

     有些人认为,最终我们放松一点时间,有意想不到的事情发生--公司组织结构调整. 公司由于业务范围调整,所以要进行对应的组织结构调整.PMO部门也随之重组,项目经理俱乐部的活动改成项目交流会,请项目 ...

  6. Mahout推荐算法ItemBased

    Mahout推荐的ItemBased 一.   算法原理 (一)    基本的 下面的例子,参见图评分矩阵:表现user,归类为item. 图(1) 该算法的原理: 1.  计算Item之间的相似度. ...

  7. redis入门(转)

    Redis介绍 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表.哈希.集合和有序集合5种.支持在服务器端计算集合 ...

  8. POJ1469_COURSES(二部图最大匹配)

    解决报告 http://blog.csdn.net/juncoder/article/details/38136065 题目传送门 题意: n个学生p门课程,每一个学生学习0或1以上的课程. 问:能否 ...

  9. Hive自己定义函数的使用——useragent解析

    想要从日志数据中分析一下操作系统.浏览器.版本号使用情况.可是hive中的函数不能直接解析useragent,于是能够写一个UDF来解析.useragent用于表示用户的当前操作系统,浏览器版本号信息 ...

  10. WEB安全实战(一)SQL盲注

    前言 好长时间没有写过东西了,不是不想写,仅仅只是是一直静不下心来写点东西.当然,拖了这么长的时间,也总该写点什么的.近期刚刚上手安全方面的东西,作为一个菜鸟,也本着学习的目的,就谈谈近期接触到的安全 ...