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

轉載來源: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. }  
發佈了5 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章