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. }  
Android Studio 中设置背景虚化,可以通过以下步骤实现: 1. 在布局文件中添加一个背景图片或颜色作为背景。 2. 在该布局文件中添加一个 ViewGroup,例如 FrameLayout。 3. 在该 ViewGroup 中添加要显示的内容。 4. 在布局文件中添加以下代码,将该 ViewGroup 设置为模糊背景: ``` <FrameLayout android:id="@+id/background" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/background_image" android:alpha="0.8" android:visibility="invisible"> <View android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent"/> </FrameLayout> ``` 5. 在 Activity 中找到该 ViewGroup,并使用 RenderScript 模糊背景,代码如下: ``` private void blurBackground() { final View backgroundView = findViewById(R.id.background); final View contentView = findViewById(R.id.content); final RenderScript rs = RenderScript.create(this); final Allocation input = Allocation.createFromBitmap(rs, getDrawingCache(backgroundView)); final Allocation output = Allocation.createTyped(rs, input.getType()); final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setInput(input); script.setRadius(25); script.forEach(output); output.copyTo(getDrawingCache(contentView)); rs.destroy(); } private Bitmap getDrawingCache(View view) { view.setDrawingCacheEnabled(true); view.buildDrawingCache(); final Bitmap drawingCache = view.getDrawingCache(); if (drawingCache == null) { return Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); } else { return drawingCache; } } ``` 以上就是在 Android Studio 中设置背景虚化的步骤。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值