在用android的Canvas画图时,调用Canvas.setBitmap方法报错,IllegalStateException

来源:互联网 发布:淘宝商城冰箱价格 编辑:程序博客网 时间:2024/06/07 04:04
为了实现类似于QQ发送图片之前可以编辑的功能,我调用了如下方法简单的两汉代码:
// 创建一个与该View大小相同的缓冲区cacheBitmap = Bitmap.createBitmap(BitmapFactory.decodeFile(picPath));// 设置cacheCanvas将会绘制到内存中的cacheBitmap上cacheCanvas.setBitmap(cacheBitmap);


运行程序后报错,报错提示如下图:

百思不得其解的我去网上查了一下,发现每一次次创建Bitmap对象的时候,这个对象都会有一个mutable属性,意思为是否可变的,我们调用
bitmap.isMutable()
发现如果通过:
BitmapFactory.decodeFile(String path)
方法创建的bitmap对象,isMutable是为false,也就是说这个bitmap是不可变的 。
但如果用
Bitmap.createBitmap(int width, int height,Config config)
BitmapFactory.decodeResource(Resources res, int id)
这两类方法创建的时候,isMutable是为true,所以我们可以知道,如果要
cacheCanvas.setBitmap(cacheBitmap);
这个方法不报错,那么传入的Bitmap参数的isMutable()一定是要为true才行,所以为了实现这个功能,我们可以在
BitmapFactory.decodeFile(String path)
这个方法创建出来的Bitmap对象再做一次转化,注意这里比较奇怪的是mutable这个属性并没有相应的setMutable方法,所以要用如下代码来解决这个问题 :
//第一次获取手机的图片Bitmap temp = BitmapFactory.decodeFile(picPath);//对这个Bitmap做一次转化,是它的isMutable为trueBitmap mBitmap = Bitmap.createScaledBitmap(temp, temp.getWidth(), temp.getHeight(), false);// 设置cacheCanvas将会绘制到内存中的cacheBitmap上cacheCanvas.setBitmap(mBitmap);

这样就可以成功解决这个奇怪的问题啦
0 0
原创粉丝点击