Неизменяемая ошибка сбоя битмапа
java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor at android.graphics.Canvas.(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);
Я думаю, это связано с этим?
- Определите, работает ли на корневом устройстве
- Как resize растрового изображения эффективно и без потери качества в Android
- GridView VS GridLayout в приложениях для Android
- Как работают убийцы задач?
- Сборщик мусора в Android
- Как создать стандартные кнопки Borderless (как указано в руководстве по проектированию)?
- Привязка данных Android с использованием тега include
- ориентация экрана для Android
- В андроидном приложении Toolbar.setTitle метод не действует - имя приложения отображается как заголовок
- Как настроить пользовательское хранилище ключей для отладки в eclipse для Android
- Android Bitmap для Base64 String
- Android: элементы ListView с несколькими кнопками
- Как создать текстовый файл и вставить данные в этот файл на Android
Вы должны преобразовать свой workingBitmap
в Mutable Bitmap
для рисования на Canvas
. (Примечание: этот метод не помогает экономить память, он будет использовать дополнительную память)
Bitmap workingBitmap = Bitmap.createBitmap(chosenFrame); Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(mutableBitmap);
Этот ответ помогает не тратить память. Преобразование неизменяемого растрового изображения в изменяемое bitmap
BitmapFactory.decodeResource()
возвращает неизменяемую копию растрового изображения, и вы не можете рисовать его на canvasе. Чтобы получить свой canvas, вам нужно получить измененную копию растрового изображения изображений, и это можно сделать с добавлением однострочного кода.
opt.inMutable = true;
Добавьте эту строку в свой код, и он должен обратиться к сбою.
чтобы минимизировать использование памяти, вы можете проверить этот пост о преобразовании / расшифровке измененного битового массива прямо из ресурсов:
Если вы не хотите превращать IMMUTABLE bitmap в bitmap MUTABLE, вы можете сэкономить память, ВСЕГДА ИСПОЛЬЗУЙТЕ БИТМАП
workingBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(workingBitmap);
Однако я думаю, что это может быть так же, как сделать bitmap изменчивым, вызвав
workingBitmap.isMutable = true