项目中遇到的需求,需要截图,截图方法如下
此方法传入一个想要截图的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>