2025-05-17

上一篇https://www.aiwalls.com/kf/201203/123434.html 是講到如何將view映射成bitmap,但是在使用的時候有時候會出現getDrawingCache()返回的結果是null而NullPointException的異常,我嘗試瞭很多種方式去尋找問題,在buildDrawingCache()的時候得到的結果就是null瞭,後通過debug源碼找到瞭問題的原因。

      在android.view.View中,有一個方法是buildDrawingCache(boolean autoScale),這個方法是在getDrawingCache()方法或者是在調用buildDrawingCache()時會被調用,在這個方法中有幾段代碼是這樣的:

 

 

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

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瞭。現在知道問題之所在,就知道怎麼解決瞭。

 

 

       如有問題,請留言,會盡快恢復。

 作者 zartzwj  

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *