论坛首页 移动开发技术论坛

Android:getDrawingCache() = null的解决方法

浏览 6860 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-06-20  

 

     上一篇是讲到如何将view映射成bitmap,但是在使用的时候有时候会出现getDrawingCache()返回的结果是null而NullPointException的异常,我尝试了很多种方式去寻找问题,在buildDrawingCache()的时候得到的结果就是null了,后通过debug源码找到了问题的原因。

      在android.view.View中,有一个方法是buildDrawingCache(boolean autoScale),这个方法是在getDrawingCache()方法或者是在调用buildDrawingCache()时会被调用,在这个方法中有几段代码是这样的:

 

 

if (width <= 0 || height <= 0 ||
                     // Projected bitmap size in bytes
         (width * height * (opaque && !translucentWindow ? 2 : 4) >
                 ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {
                destroyDrawingCache();
                return;
  }
 

 

 

        在上面的代码中,width和height是所要cache的view绘制的宽度和高度,所以(width * height * (opaque && !translucentWindow ? 2 : 4) 计算的是当前所需要的cache大小。

 

        ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()得到的是系统所提供的最大的DrawingCache的值。所以我在debug时捕获到的null的原因就是:所需要的drawingCache >系统所提供的最大DrawingCache值。

 

        所以在只需要修改所需的cache值就可以解决问题了,而且也可以修改drawingCacheBackgroundColor的值来适当减少所需的cache值,在上面代码中的opaque值就是格局drawingCacheBackgroundColor来得到的,所以可以控制(opaque && !translucentWindow ? 2 : 4)的值,使之为2就能将cache值减小一半。

 

       现在来说说如何知道系统所能提供的最大DrawingCache值,也就是ScaledMaximumDrawingCacheSize的值的大小。

 

       Android提供了一种比较简单的方式来计算:就是用将当前屏幕的分辨率的高和宽相乘,然后再乘以4就可以得到了ScaledMaximumDrawingCacheSize值了。例如:屏幕分辨率为:320*480,所以ScaledMaximumDrawingCacheSize=324*480*4;

 

       因为我之前调试的时候一直使用android 1.5,所以所提供的屏幕分辨率最大为320*480,所以就会出现getDrawingCache()=null了。现在知道问题之所在,就知道怎么解决了。

 

 

       如有问题,请留言,会尽快恢复。

 

   发表时间:2011-06-24  
终于找到原因了。thank有。
我用的背景图太大,超过屏幕大小了,这个时候getDrawingCache()返回的结果是null
我把背景图剪切到320×480就没事了一刚。
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics