不可变的位图崩溃错误

java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor at android.graphics.Canvas.<init>(Canvas.java:127) at app.test.canvas.StartActivity.applyFrame(StartActivity.java:214) at app.test.canvas.StartActivity$1.onClick(StartActivity.java:163) at android.view.View.performClick(View.java:4223) at android.view.View$PerformClick.run(View.java:17275) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4898) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) at dalvik.system.NativeStart.main(Native Method) 

我从开发者控制台得到这个崩溃错误..我不明白是什么问题..

  BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inScaled = true; opt.inPurgeable = true; opt.inInputShareable = true; Bitmap brightBitmap = BitmapFactory.decodeResource(getResources(), position, opt); brightBitmap = Bitmap.createScaledBitmap(brightBitmap, 550, 550, false); chosenFrame = brightBitmap; Bitmap workingBitmap = Bitmap.createBitmap(chosenFrame); workingBitmap = Bitmap.createBitmap(workingBitmap); Canvas c = new Canvas(workingBitmap); 

我认为这与此有关?

您必须将您的workingBitmap转换为Mutable Bitmap图在Canvas绘图。 (注意:这种方法不能帮助节省内存,它会使用额外的内存)

 Bitmap workingBitmap = Bitmap.createBitmap(chosenFrame); Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(mutableBitmap); 

这个答案有助于不浪费内存将不可变的位图转换为可变的位图

BitmapFactory.decodeResource()返回位图的不可变副本,并且不能绘制到其canvas。 为了得到它的canvas,你需要得到一个可变的图像位图的副本,可以添加单行代码。

 opt.inMutable = true; 

将该行添加到您的代码,它应该解决崩溃。

为了最大限度地减less内存使用,你可以看看这个post,关于直接从资源转换/解码一个可变的位图:

https://stackoverflow.com/a/16314940/878126