请教:执行canvas.setBitmap(bt)出错,错误提示如下:java.lang.IllegalStateException 本帖最后由 mic47 于 2011-06-18 16:24:48 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 at android.graphics.Canvas.setBitmap(Canvas.java:144)at com.zl.android.game.LogoImp.onDraw(LogoImp.java:64)LogoImp类的64行有错哦,非法状态 不知道这个问题是否解决了。我今天2012-8-1也遇到了同样的问题。现已经解决。分享一下:Root cause:Canvas.setBitmap 会先判断 bitmap.isMutable() 如果为false 就会抛出java.lang.IllegalStateException 异常。那么 isMutable() 究竟是什么意思?意思是 不可以修改的意思。也就是说这个 bitmap只能被用来canvas.draw(), 如果使用canvas.setBitmap()就意味着这个bitmap是要修改的 因为canvas会向这个bitmap上绘制。具体的解决方案:1 如果你的bitmap是 isMutable()的,那么 你不要调用setBitmap要调用drawBitmap2 如果你真的要修改你的bitmap,那可以使用 bitmap.copy 这个函数来copy一个 这时候可以指定mutable参数。注意事项:注意当你使用bitmap.copy的时候,意味着内存中有多张bitmap这可能会产生outofmemory.那么是否可以直接改变 isMutable呢不可以,这个变量是final类型的。是否可以使用 createBitmap(oriSrc) 这个函数也是无法返回非isMutable bitmap的。如果是isMutable,那么直接返回参数中传进来的 oriSrc.基本上是这样的。 感觉还是没说清楚怎么建立一个mutable的位图啊? 4楼说得好!我今天也碰到了。你可以看一下,肯定是由你canvas.setBitmap(Bitmap);这个方法造成的。解决方法如4楼说的。如果你调用的是new Canvas();那么接下来在未调用其它方法前必需mCanvas.setBitmap(bgBitmap)才行。且不可多次调用setBitmap。 Android 4.0如何屏蔽最近打开按钮呢 Android模拟器上有没有振动和音乐效果 关于android中ListView使用的问题 使用Android Junit Test出现了异常 我写的程序 跑一会儿就会卡主,是不是多线程的问题? 有谁用过apkplug框架开发过应用? android模拟器连接局域网的web服务器 Android应用程序启动时怎么设置背景图片 Android studio 2.3使用出现的问题——没有getdefault android 手机文件夹加密 BroadcastReceiver中能否进行Socket通信
at com.zl.android.game.LogoImp.onDraw(LogoImp.java:64)LogoImp类的64行有错哦,非法状态
Root cause:
Canvas.setBitmap 会先判断 bitmap.isMutable() 如果为false 就会抛出java.lang.IllegalStateException 异常。
那么 isMutable() 究竟是什么意思?意思是 不可以修改的意思。也就是说这个 bitmap只能被用来canvas.draw(), 如果使用canvas.setBitmap()就意味着这个bitmap是要修改的 因为canvas会向这个bitmap上绘制。具体的解决方案:
1 如果你的bitmap是 isMutable()的,那么 你不要调用setBitmap要调用drawBitmap
2 如果你真的要修改你的bitmap,那可以使用 bitmap.copy 这个函数来copy一个 这时候可以指定mutable参数。注意事项:
注意当你使用bitmap.copy的时候,意味着内存中有多张bitmap这可能会产生outofmemory.那么是否可以直接改变 isMutable呢不可以,这个变量是final类型的。是否可以使用 createBitmap(oriSrc) 这个函数也是无法返回非isMutable bitmap的。如果是isMutable,那么直接返回参数中传进来的 oriSrc.基本上是这样的。
你可以看一下,肯定是由你canvas.setBitmap(Bitmap);这个方法造成的。
解决方法如4楼说的。如果你调用的是new Canvas();那么接下来在未调用其它方法前必需mCanvas.setBitmap(bgBitmap)才行。且不可多次调用setBitmap。