2013-05-01 2 views
0

Привет, ребята, я борюсь с растровыми изображениями и холстом. Я пытаюсь сделать фотографию с помощью камеры, а затем разрешить пользователю создавать два прямоугольника (скользя пальцем) и пометить их на изображении (прямоугольники должны быть отмечены до нажатия кнопки, фотография не сохраняется, он всегда находится в памяти). Поэтому, основываясь на примере камеры, я сделал макет с 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? Спасибо заранее.

ответ

0

Ну, после долгого времени я мог рисовать растровое изображение. Случилось так, что у меня было несколько ошибок: во-первых, я пытался рисовать SurfaceView, что невозможно, а во-вторых, я добавил ImageView, чтобы содержать растровое изображение и холст, так что теперь мой код выглядит как это:

Bitmap tempBitmap = Bitmap.createScaledBitmap(bt, bt.getWidth(), bt.getHeight(), true); 
Canvas canvas = new Canvas(tempBitmap); 
Paint paint = new Paint(); 
paint.setColor(Color.GREEN); 
canvas.drawLine(x1, y1, x2, y1, paint);//up 
canvas.drawLine(x1, y1, x1, y2, paint);//left 
canvas.drawLine(x1, y2, x2, y2, paint);//down 
canvas.drawLine(x2, y1, x2, y2, paint); 

ImageView iView = (ImageView)findViewById(R.id.imageViewPreview); 
iView.setImageBitmap(tempBitmap); 
iView.draw(canvas); 

Этот код в отдельный вид деятельности, в которой я реализовал в OnTouchListener, чтобы прочитать координаты для рисования прямоугольника. После прочтения координат выполняется код.
Для справки, макет - это FrameLayout, содержащий ImageView (см. Ответ this).
Этот код, наконец, нарисовав прямоугольник, но повезло мне изображение становится больше :(, но это другой вопрос, так что если вы хотите следовать этому here is the link.

0

Вы создаете холсты и растровые изображения, но вы никогда не подключить их к вашему мнению:

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); 

Вам нужно создать одну битовую карту (вы сделали, что до вершины), то рисовать как прямоугольники там, затем подключите что растровое изображение к вашему мнению:

if (coordinates for rect1 are set) { 
    Paint paint = new Paint(); 
    Canvas canvas = new Canvas(bitmapPicture); 
    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(); 
      Canvas canvas = new Canvas(bitmapPicture); 
      paint.setColor(Color.YELLOW); 
      paint.setStrokeWidth(3); 
      canvas.drawRect(/*all of my end coordinates*/, paint); 
     } 
    } 
} 
yourImageView.setImageDrawable(new BitmapDrawable(getResources(), bitmapPicture)); 
+0

Привет @HaIR, спасибо за ваш ответ, но это Ждут» t работал: я думаю, что вы правы в отношении несвязанного растрового изображения и холста, но когда я запускаю приложение, у меня есть исключение «IllegalStateException: неизменяемый битмап, переданный конструктору Canvas» при выполнении «нового Canvas (bitmapPicture)» (я читаю один раз, что я не должен использовать оригинальное растровое изображение). – maxivis

+0

Это было бы разумно. Вы пытаетесь создать новое растровое изображение и привязать его к представлению setImageView к imageView? В любом случае вам нужно, чтобы он подключался к вашей иерархии представлений, а не просто плавал в limbo. – HalR

+0

Да @HaIR, я попытался настроить растровое изображение, связанное с холстом, на ImageView b ничего не случилось. Об этом вопросе у меня есть вопрос, в моей первой реализации у меня был только SurfaceView, но теперь из-за вашего ответа я добавил ImageView, это правильно (я имею в виду, что SurfaceView и ImageView в том же макете) или ImageView следует использовать вместо SurfaceView, или, может быть, он должен быть в другом макете? – maxivis

Смежные вопросы