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

来源:互联网 发布:两个矩阵的协方差 编辑:程序博客网 时间:2024/06/14 06:21

转载来源:http://zartzwj.iteye.com/blog/1098839


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

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

 

 

Java代码  收藏代码
  1. if (width <= 0 || height <= 0 ||  
  2.                      // Projected bitmap size in bytes  
  3.          (width * height * (opaque && !translucentWindow ? 2 : 4) >  
  4.                  ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {  
  5.                 destroyDrawingCache();  
  6.                 return;  
  7.   }  
 

 

 

        在上面的代码中,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了。现在知道问题之所在,就知道怎么解决了。

 

 

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

 

 

 

一个好的解决方案是:

Java代码  收藏代码
  1. public static Bitmap convertViewToBitmap(View view){  
  2.       view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  
  3.         view.layout(00, view.getMeasuredWidth(), view.getMeasuredHeight());  
  4.         view.buildDrawingCache();  
  5.         Bitmap bitmap = view.getDrawingCache();  
  6.   
  7.      return bitmap;  
  8. }  
原创粉丝点击