#android #canvas #illegalstateexception
#Android #холст #исключение illegalstateexception
Вопрос:
Я пытался установить растровое изображение на холст с помощью setBitMap
, в то время я получил исключение IllegalStateException.В настоящее время на этом холсте есть несколько изображений, я пытаюсь его заменить. У кого-нибудь есть идеи, почему это произошло?
Фрагмент кода
editBm = Bitmap.createBitmap(951, 552, Bitmap.Config.ARGB_8888);
Canvas mCanvas=new Canvas(editBm);
eBit=LoadBMPsdcard(filePath); ---->returns a bitmap when the file path to the file is provided
Log.i("BM size", editBm.getWidth() "");
mCanvas.setBitmap(eBit);
Я не получаю никаких ошибок NullPointer, и метод LoadBMPsdcard()
работает хорошо.
Пожалуйста, дайте мне знать о любых ваших идеях…
Заранее спасибо
Удачного кодирования
Комментарии:
1. опубликуйте свой logcat и метод LoadBMPsdcard()
Ответ №1:
Исключение IllegalStateException может возникать из-за того, что вы загружаете растровое изображение (eBit) и используете mCanvas.setBitmap(eBit)
, не проверяя, является ли растровое изображение изменяемым. Это требуется для рисования на растровом изображении. Чтобы убедиться, что ваше растровое изображение изменяемо, используйте:
eBit=LoadBMPsdcard(filePath);
Bitmap bitmap = eBit.copy(Bitmap.Config.ARGB_8888, true);
canvas.setBitmap(bitmap);
Ответ №2:
Попробуйте использовать drawBitmap вместо setBitmap. Похоже, вы уже настроили растровое изображение для рисования, передав его в конструктор canvas, так что теперь вам просто нужно нарисовать все на нем.
Ответ №3:
Canvas.setBitmap()
выдает, IllegalStateException
если и только если Bitmap.isMutable()
возвращает true. Bitmap.createBitmap()
создает только неизменяемый экземпляр Bitmap во всех его формах. Для создания изменяемого растрового изображения вы либо используете new Bitmap()
, либо Bitmap.copy(true)
, в зависимости от того, есть ли у вас исходное растровое изображение, с которого вы хотите начать. Типичный блок для меня выглядит как:
Bitmap image = ...
Canvas c = new Canvas(image.isMutable()?image:image.copy(true));
...
Это предполагает, конечно, что вы не возражаете против искажения исходного растрового изображения (чего я обычно не делаю, но это ни в коем случае не универсально).