Привет, ребята, я борюсь с растровыми изображениями и холстом. Я пытаюсь сделать фотографию с помощью камеры, а затем разрешить пользователю создавать два прямоугольника (скользя пальцем) и пометить их на изображении (прямоугольники должны быть отмечены до нажатия кнопки, фотография не сохраняется, он всегда находится в памяти). Поэтому, основываясь на примере камеры, я сделал макет с SurfaceView для предварительного просмотра камеры, а затем добавил код для рисования прямоугольников в методе onPictureTaken. Я искал некоторые примеры того, как его реализовать, но, конечно, не работает. До сих пор, у меня есть этот код (внутри onPictureTaken):Невозможно нарисовать холст в растровое изображение android
final Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0,
arg0.length);
surfaceView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN:
if (source coordinates of rect1 are not set) {
setSourceCoordinatesForRect1FromArg1();
} else {
setSourceCoordinatesForRect2FromArg1();
}
break;
case MotionEvent.ACTION_UP:
if (end coordinates of rect1 are not set) {
setEndCoordinatesForRect1FromArg1();
} else {
setEndCoordinatesForRect2FromArg1();
}
break;
default:
break;
}
if (coordinates for rect1 are set) {
Paint paint = new Paint();
Bitmap bmOverlay = Bitmap.createBitmap(bitmapPicture.getWidth(), bitmapPicture.getHeight(), bitmapPicture.getConfig());
Canvas canvas = new Canvas(bmOverlay);
paint.setColor(Color.GREEN);
paint.setStrokeWidth(3);
canvas.drawRect(/*all of my source coordinates*/, paint);
} else {
if (coordinates for rect2 are set) {
Paint paint = new Paint();
Bitmap bmOverlay = Bitmap.createBitmap(bitmapPicture.getWidth(), bitmapPicture.getHeight(), bitmapPicture.getConfig());
Canvas canvas = new Canvas(bmOverlay);
paint.setColor(Color.YELLOW);
paint.setStrokeWidth(3);
canvas.drawRect(/*all of my end coordinates*/, paint);
}
}
return true;
}
});
У меня нет каких-либо исключений, но прямоугольники не нарисованы, так что я буду очень признателен, если кто-то может сказать мне, что я делать неправильно. Кроме того, для моего конкретного сценария было бы целесообразно использовать GestureDetector вместо создания пользовательского OnTouchListener? Спасибо заранее.
Привет @HaIR, спасибо за ваш ответ, но это Ждут» t работал: я думаю, что вы правы в отношении несвязанного растрового изображения и холста, но когда я запускаю приложение, у меня есть исключение «IllegalStateException: неизменяемый битмап, переданный конструктору Canvas» при выполнении «нового Canvas (bitmapPicture)» (я читаю один раз, что я не должен использовать оригинальное растровое изображение). – maxivis
Это было бы разумно. Вы пытаетесь создать новое растровое изображение и привязать его к представлению setImageView к imageView? В любом случае вам нужно, чтобы он подключался к вашей иерархии представлений, а не просто плавал в limbo. – HalR
Да @HaIR, я попытался настроить растровое изображение, связанное с холстом, на ImageView b ничего не случилось. Об этом вопросе у меня есть вопрос, в моей первой реализации у меня был только SurfaceView, но теперь из-за вашего ответа я добавил ImageView, это правильно (я имею в виду, что SurfaceView и ImageView в том же макете) или ImageView следует использовать вместо SurfaceView, или, может быть, он должен быть в другом макете? – maxivis