轉載來源:http://zartzwj.iteye.com/blog/1098839
上一篇是講到如何將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了。現在知道問題之所在,就知道怎麼解決了。
如有問題,請留言,會盡快恢復。
一個好的解決方案是:
- public static Bitmap convertViewToBitmap(View view){
- view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
- view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
- view.buildDrawingCache();
- Bitmap bitmap = view.getDrawingCache();
- return bitmap;
- }