上一篇是讲到如何将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;
}
分享到:
相关推荐
本文主要探讨了如何在Android中将View转换为Bitmap以及如何处理getDrawingCache返回null的问题。 首先,Android提供了两种基本的将View转换为Bitmap的方法。一种是通过`draw`方法直接在Canvas上绘制View,另一种则...
在Android系统中,屏幕截屏是一项常见的功能,用于捕捉设备屏幕上显示的内容。本文将深入探讨Android屏幕截屏的实现原理,并分享相关的源码分析。在Android开发中,我们可以使用多种方式来实现屏幕截屏,包括系统...
从Android 7.0(API 24)开始,外部存储的写入方式发生了变化,需要使用`getExternalFilesDir()`、`getExternalCacheDir()`等方法来获取可写目录,或者使用`FileProvider`来分享文件。 1. **使用FileProvider**:在...
要实现截图,可以使用Android提供的`View`类的`draw()`方法。在`onCreate()`方法中添加一个按钮,点击时截取地图视图: ```java Button screenshotBtn = findViewById(R.id.screenshot_btn); screenshotBtn....
Android截屏截图的几种方法总结 Android截屏截图是 Android 开发中常见的需求, Android 截屏截图方法汇总将为您带来多种截屏截图方法的总结,让您更好地掌握 Android 截屏截图技术。在本文中,我们将探讨 ...
在Android应用开发中,有时我们需要实现截图和分享功能,让用户能够快速截取当前屏幕内容并与他人分享。本文将详细介绍如何在Android中实现这两个功能,并提供相关的代码示例。 首先,让我们看看XML布局部分。这里...
在Android开发中,实现截屏功能是常见的需求之一,尤其对于开发者来说,它能帮助调试和展示应用界面。本文将详细介绍如何在Android中通过代码实现截屏功能,并提供相关的实现代码。 首先,为了能够保存截图到设备的...
本文将深入探讨两种在Android中实现截屏的方法:通过DecorView的getDrawingCache()方法和使用SurfaceControl的screenshot()方法。 首先,让我们来了解第一种方法——使用DecorView的getDrawingCache()。DecorView是...
2. **获取Bitmap**:通过调用`getDrawingCache()`方法获取视图的Bitmap。 3. **压缩并保存**:将Bitmap压缩成JPEG格式,并保存至指定路径。 #### 三、代码实现 下面是一个简单的屏幕截图功能的实现示例。 ```java...
方法1: 首先想到的思路是利用SDK提供的View.getDrawingCache()方法: public void printScreen(View view) { String imgPath = "/sdcard/test.png"; view.setDrawingCacheEnabled(true); view....
Android 实现屏幕截图并保存截图到指定文件 Android 实现屏幕截图并保存截图到指定文件是 Android 开发中的一种常见需求。通过使用 Android 的 Graphics 和 IO 操作,可以轻松地实现屏幕截图并将其保存到指定的文件...
这使得它可以在后台线程进行高效的绘制,但同时也意味着普通的截图方法如`View.draw()`或`View.getDrawingCache()`无法获取到`SurfaceView`的内容。为了解决这个问题,我们需要采取一些额外的步骤。 1. **捕获...
在Android平台上,实现指定区域截屏是一项常见的需求,尤其对于开发者来说,可能需要对特定的UI元素进行截图测试或者创建自定义的分享功能。本文将详细介绍如何在Android中实现这一功能,包括理解屏幕截图的基本原理...
"Android 取得当前屏幕的截图" ...Android 取得当前屏幕的截图需要使用 Bitmap 类里的方法来取得当前屏幕的 bitmap,然后裁剪和保存 bitmap。通过这个过程,可以实现 Android 应用程序的屏幕截图功能。
在Android应用开发中,有时我们需要实现一些特殊的功能,如调用相机拍照、截取界面视图,甚至在没有用户预览的情况下进行静默拍照。这些功能在特定场景下有着广泛的应用,例如创建自定义相机应用或者需要后台拍摄的...
Bitmap bitmap = Bitmap.createBitmap(img_iv.getDrawingCache()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.JPEG, 100, bos); values.put("img", ...
- 使用Drawing Cache时,如果View设置了`android:background="@android:color/transparent"`,可能会导致getDrawingCache返回null。这是因为透明背景的View不会自动创建Drawing Cache。解决办法是在使用前手动设置...
Bitmap是Android中用于表示图像数据的类,它提供了丰富的操作方法,如缩放、裁剪、旋转等。在生成Bitmap后,我们可以使用`Bitmap.createScaledBitmap()`进行尺寸调整,`Bitmap.createBitmap()`用于创建一个新的...