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

为了实现类似于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为true
		Bitmap mBitmap = Bitmap.createScaledBitmap(temp, temp.getWidth(), temp.getHeight(), false);
		// 设置cacheCanvas将会绘制到内存中的cacheBitmap上
		cacheCanvas.setBitmap(mBitmap);

这样就可以成功解决这个奇怪的问题啦
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值