学徒浅析Android——getDrawingCache()返回为NULL的原因

本文探讨了在使用WebView进行截图时,getDrawingCache()返回NULL的问题,原因是视图大小超过缓存容量。介绍了getDrawingCache()和buildDrawingCache()的用法及其内部机制,并通过Android源码分析了问题原因。同时提到了设置自动缩放可能导致的更大缓存需求。
摘要由CSDN通过智能技术生成

本篇文章已授权微信公众号 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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值