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>
时间: 2024-08-24 09:07:13

android 屏幕截图时,如何更改截图内容,将两个bitmap合并一起显示图像的相关文章

Android运行时配置更改

Android支持在运行时更改语言,位置.硬件.它是通过终止和重启activity来实现上诉功能的.可起到强制重新评估activity中使用的资源的分辨率,并为心得配置选择最合适的资源值. 要让activity可以监听运行时配置更改,需要向它的manifest节点中添加一个android:configChanges属性来说明希望对哪些配置更改进行处理 下面的列表描述了可以指定的运行时更改: mcc和mnc    检测到sim,并且与之关联的国家或者网络的代码发生了变化 locale    用户改

第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4456420.html 联系方式:[email protected] [系列] 第一次使用Android Studio时你应该知道的一切配置 第一次使用Android Studio时你应该知道的一切配置(二):新建一个属于自己的工程并安装Genymotion模拟器 第一次使用Android Stu

Android 最新L版本,更新内容

Android L版本重大修改 一:New Android Runtime (ART) 新的运行环境,4.4一下的版本ART是可选的运行环境,默认还是Dalvik.但是在Android L版本之后默认环境就是ART了. 新的特性如下: 1.Ahead-of-Time (AOT).提前预编译,在运行时之前将代码编译成可执行的文件,并保存起来. 2.改进了垃圾回收功能. 3.改进了bug调试功能. 大多数应用不需要更改便可以运行在ART环境下,但是一下的情况你需要注意一下: 1.使用了Java Na

在Eclipse中开发Android程序时截屏的方法

在Eclipse中调试Android程序时,有时需要将程序截图保存到电脑中.步骤如下: Window --- Show View --- Other : 在弹出的窗口中,选择 Devices : 在打开的Device选项卡中,选择要截图的设备或模拟器,然后点击旁边的截图按钮: 在弹出的窗口中,点击 Save 按钮,将程序截图保存到指定的目录中即可.

android怎么得到通知栏的消息内容,然后保存消息

============问题描述============ android怎么得到通知栏的消息内容,然后保存消息,也就是来了一条消息,点击进去之后显示的界面怎么知道点击的通知的ID和内容还有时间信息. ============解决方案1============ 这个,真做不了. 通知管理器只能发送通知.不能取得通知. android系统也是为了安全性考虑 要是你可以取得别的程序的通知和通知里面的东西. 那岂不是就可以更改里面的内容,并且可以修改将要跳转的地方. 那样我就可以点击qq动听的通知,跳到

Android开发经验分享-GridView、ListView内容错乱

在使用GridView.ListView的过程中遇到内容错乱的问题,费了较长时间才找到问题的根源,特地总结一下. 1.在自定义adapter中没有给每一项都设置内容导致内容错乱: @Override public View getView(final int position, View convertView, ViewGroup parent) { if( null == convertView ){ mGridHolder = new GridHolder( ); convertView

Android基础笔记(十三)- 内容提供者原理和简单使用

为什么要有内容提供者 内容提供者的工作原理 使用内容解析者对内容提供者进行增删改查操作 利用内容提供者和内容解析者备份手机短信 利用内容提供者插入短信 为什么要有内容提供者 内容提供者技术的目的是: 把私有数据库的数据的内容暴露给外部使用: 我们知道,微信.QQ等应用都可以读取手机中联系人和短信的数据.而联系人和短信都是系统内置的应用,它们的数据都存储在相应的数据库中. 在com.android.provider.telephony/databases/mmssms.db就是短信的数据库,通过下

Android 编译时注解-提升

Android 编译时注解-提升 背景 在前面的文章中,讲解了注解和编译时注解等一些列相关的内容,为了更加全面和真是的了解Android 编译时注解在实战项目中的使用,本文采取实现主流框架butterknife注入view去全面认识编译时注解. 注解专栏-博客 效果 先来张图压压惊,实现效果butterknife的view绑定 使用 仿照butterknife实现了@BindView注解,通过WzgJector.bind方法绑定当前MainActivity,整体和butterknife使用完全一

android 学习随笔二十一(内容提供者 )

一.内容提供者* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的私有数据* 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码,举例增方法 @Override public Uri insert(Uri uri, ContentValues values) { db.insert("person", null, values); return uri; }* 在清单文件中定义内容提供者的标签,注意必须