`
zartzwj
  • 浏览: 27033 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

 

     上一篇是讲到如何将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;
}
 
分享到:
评论
5 楼 499202654 2013-05-16  
先谢谢, 但是这样 最多就能转化两屏幕的内容  如果 view 太高的话怎么办啊  系统默认的最大值可以修改吗   QQ 499202654 谢谢帮忙
4 楼 a455642158 2012-12-13  
非常感谢,不为null了,但是弄出来的图太小啦……先调调。
3 楼 shaopin 2012-08-10  
怎么设置cache值呢,谢谢
2 楼 qq5345339 2012-06-03  
还是有问题。可以贴出代码解决方法吗?这问题我解决了一星期了。求帮忙。
1 楼 gundumw100 2011-06-24  
终于找到原因了。thank有。
我用的背景图太大,超过屏幕大小了,这个时候getDrawingCache()返回的结果是null
我把背景图剪切到320×480就没事了一刚。

相关推荐

    解析Android中View转换为Bitmap及getDrawingCache=null的解决方法

    本文主要探讨了如何在Android中将View转换为Bitmap以及如何处理getDrawingCache返回null的问题。 首先,Android提供了两种基本的将View转换为Bitmap的方法。一种是通过`draw`方法直接在Canvas上绘制View,另一种则...

    android 屏幕截屏源码分享

    在Android系统中,屏幕截屏是一项常见的功能,用于捕捉设备屏幕上显示的内容。本文将深入探讨Android屏幕截屏的实现原理,并分享相关的源码分析。在Android开发中,我们可以使用多种方式来实现屏幕截屏,包括系统...

    android调用相机、相册以及截图处理

    从Android 7.0(API 24)开始,外部存储的写入方式发生了变化,需要使用`getExternalFilesDir()`、`getExternalCacheDir()`等方法来获取可写目录,或者使用`FileProvider`来分享文件。 1. **使用FileProvider**:在...

    android百度地图定位截图demo

    要实现截图,可以使用Android提供的`View`类的`draw()`方法。在`onCreate()`方法中添加一个按钮,点击时截取地图视图: ```java Button screenshotBtn = findViewById(R.id.screenshot_btn); screenshotBtn....

    Android截屏截图的几种方法总结

    Android截屏截图的几种方法总结 Android截屏截图是 Android 开发中常见的需求, Android 截屏截图方法汇总将为您带来多种截屏截图方法的总结,让您更好地掌握 Android 截屏截图技术。在本文中,我们将探讨 ...

    Android实现截图和分享功能的代码

    在Android应用开发中,有时我们需要实现截图和分享功能,让用户能够快速截取当前屏幕内容并与他人分享。本文将详细介绍如何在Android中实现这两个功能,并提供相关的代码示例。 首先,让我们看看XML布局部分。这里...

    android截屏功能实现代码

    在Android开发中,实现截屏功能是常见的需求之一,尤其对于开发者来说,它能帮助调试和展示应用界面。本文将详细介绍如何在Android中通过代码实现截屏功能,并提供相关的实现代码。 首先,为了能够保存截图到设备的...

    android 截屏

    本文将深入探讨两种在Android中实现截屏的方法:通过DecorView的getDrawingCache()方法和使用SurfaceControl的screenshot()方法。 首先,让我们来了解第一种方法——使用DecorView的getDrawingCache()。DecorView是...

    android 屏幕截图功能

    2. **获取Bitmap**:通过调用`getDrawingCache()`方法获取视图的Bitmap。 3. **压缩并保存**:将Bitmap压缩成JPEG格式,并保存至指定路径。 #### 三、代码实现 下面是一个简单的屏幕截图功能的实现示例。 ```java...

    Android代码-CapWindow

    方法1: 首先想到的思路是利用SDK提供的View.getDrawingCache()方法: public void printScreen(View view) { String imgPath = "/sdcard/test.png"; view.setDrawingCacheEnabled(true); view....

    Android实现屏幕截图并保存截图到指定文件

    Android 实现屏幕截图并保存截图到指定文件 Android 实现屏幕截图并保存截图到指定文件是 Android 开发中的一种常见需求。通过使用 Android 的 Graphics 和 IO 操作,可以轻松地实现屏幕截图并将其保存到指定的文件...

    Android中SurfaceView截屏

    这使得它可以在后台线程进行高效的绘制,但同时也意味着普通的截图方法如`View.draw()`或`View.getDrawingCache()`无法获取到`SurfaceView`的内容。为了解决这个问题,我们需要采取一些额外的步骤。 1. **捕获...

    Android实现指定区域截屏

    在Android平台上,实现指定区域截屏是一项常见的需求,尤其对于开发者来说,可能需要对特定的UI元素进行截图测试或者创建自定义的分享功能。本文将详细介绍如何在Android中实现这一功能,包括理解屏幕截图的基本原理...

    Android取得当前屏幕的截图

    "Android 取得当前屏幕的截图" ...Android 取得当前屏幕的截图需要使用 Bitmap 类里的方法来取得当前屏幕的 bitmap,然后裁剪和保存 bitmap。通过这个过程,可以实现 Android 应用程序的屏幕截图功能。

    Android调用相机拍照,view截屏,无预览、静默拍照

    在Android应用开发中,有时我们需要实现一些特殊的功能,如调用相机拍照、截取界面视图,甚至在没有用户预览的情况下进行静默拍照。这些功能在特定场景下有着广泛的应用,例如创建自定义相机应用或者需要后台拍摄的...

    Android_0618_Note

    Bitmap bitmap = Bitmap.createBitmap(img_iv.getDrawingCache()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.JPEG, 100, bos); values.put("img", ...

    Android实现将View保存成Bitmap的方法

    - 使用Drawing Cache时,如果View设置了`android:background="@android:color/transparent"`,可能会导致getDrawingCache返回null。这是因为透明背景的View不会自动创建Drawing Cache。解决办法是在使用前手动设置...

    android 获取界面部分view,view截图,生成bitmap图片

    Bitmap是Android中用于表示图像数据的类,它提供了丰富的操作方法,如缩放、裁剪、旋转等。在生成Bitmap后,我们可以使用`Bitmap.createScaledBitmap()`进行尺寸调整,`Bitmap.createBitmap()`用于创建一个新的...

Global site tag (gtag.js) - Google Analytics