本篇文章已授权微信公众号 guolin_blog(郭霖)独家发布
在针对WebView使用getDrawingCache()进行当前屏幕截图时,发现返回的是NULL,同时在控制台看到logcat提示了一条异常信息,意思就是当前视图大小已经超过了缓存容量。内容如下:
02-01 14:21:33.512 3461-3461/com.example.sample.job W/View: View too large to fit into drawing cache, needs 9338145 bytes, only 3686400 available
但是自己第一印象是一屏内容不可能占这么多空间啊,于是搜各种方法修改,包括关闭硬件加速器等,但是还是不了了之,难道是自己打开的方式不对?最后在观摩诸位截屏大佬的布局时,才想明白我用的是ScrollView嵌套WebView啊。这样的布局结构导致我在使用getDrawingCache()时,系统因缓存超量直接取消了写入操作,drawingcache中成为了空值。下面给大家分享下这次问题的前世今生。
Android的截图手段有四五种了,尤其是在5.0以后,google提供了更好了截图方式,在这里:https://github.com/weizongwei5/AndroidScreenShot_SysApi。
getDrawingCache()是其中一种截图手段,使用方便,主要针对应用内截图,用法如下:
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();//这句话可加可不加,因为getDrawingCache()执行的主体就是buildDrawingCache()
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache(), 0, 0, view.getMeasuredWidth(), view.getMeasuredHeight() - view.getPaddingBottom());
view.setDrawingCacheEnabled(false);
view.destroyDrawingCache();
return bitmap;
getDrawingCache()自身实际上是执行getDrawingCache(false),buildDrawingCache()自身实际上是执行buildDrawingCache(false),而getDrawingCache(false)操作的实体又是buildDrawingCache(false),即get操作的执行顺序也是先build再get,两个方法最终都会执行buildDrawingCacheImpl(false)来实现drawingcache的写入getDrawingCache()只是多了一步获取drawingcache对象的操作,这里的入参false都指的是自动缩放标记,用以指导是否自动适配当前屏幕的大小的,android默认是false。你也可以调用set方法把它改成true,但是会导致你的页面缓存值更大,下面是我尝试设置为true时得到的反馈信息:
buildDrawingCache(true):
02-02 17:38:11.614 5825-5825/com.example.sample.job W/View: View too large to fit into drawing cache, needs 10022400 bytes, only 3686400 available
buildDrawin