8

Im новый для разработки Android, и мне трудно найти хорошие примеры на camera2 api.Android SDK - camera2 - рисовать прямоугольник над TextureView

Im работает медленно по большинству вопросов, но на этом я застрял. В камере по умолчанию, когда вы касаетесь экрана для фокусировки, на мгновение отображается прямоугольник области фокусировки. Я хочу сделать что-то подобное (или в этом случае, то же самое, что и начинать, чтобы я мог понять это).

Я прочитал где-нибудь (я думаю, что страница TextureView в документах SDK), что вы не можете нарисовать текстуру, пока она используется в качестве предварительного просмотра камеры, и вызов метода блокировки вернет null, а не холст.

Я нашел это онлайн: https://github.com/commonsguy/vidtry/ Но я не могу заставить его работать. Я либо ошибаюсь, заявляя, что мой основной взгляд не может быть применен к моему привлекательному виду, или наоборот. Или мой привлекательный вид сверху и делает экран черным - или его на дне и не реагируют на события касания (и пытаются заставить the performClick из представления над ним вызывает сбои.)

Im застрял! Может ли кто-нибудь дать мне объяснение или пример того, как я могу нарисовать свой прямоугольник над местом события для нескольких отрывков?

Спасибо!

+1

Не нарисовать на TextureView. Поместите (в основном прозрачный) вид сверху и нарисуйте это. – fadden

+0

Я пробовал - не мог получить это, чтобы работать. можете ли вы привести пример? – aescript

+0

Итак, у меня есть другой вид поверх него - однако я могу видеть только просмотр моей камеры, если я задал эти представления alpha 0 и bakcground: = "# 0000", но потом я не могу увидеть мой прямоугольник .... даже если я попробуйте и дайте ему альфа ...Я делаю что-то неправильно или этот SDK просто ужасно запутанный по сравнению с такими вещами, как GL/QT – aescript

ответ

4
  1. Прежде всего, например, для камеры2 api android есть код примера с открытым исходным кодом. https://github.com/googlesamples/android-Camera2Basic
  2. Вторые по части, где вы хотите, чтобы нарисовать прямоугольник (касание для фокусировки) выполните следующие действия -
    • Создайте пользовательский класс, простирающийся на SurfaceView.
    • вызов методаTouchListener в этом настраиваемом классе для обнаружения координат пальца и рисования вашего прямоугольника с использованием класса paint в android. -add этот пользовательский класс над вашим TextureView, который отображает предварительный просмотр с камеры2.
    • Включите пользовательский вид прозрачным.
    • наконец-то, когда вы коснетесь в какой-то момент на экране устройства, тогда будет вызываться onTouchListener, который будет рисовать на холсте пользовательского представления, которое вы добавили выше вашего предварительного просмотра камеры.
    • окончательно очистите свой холст, чтобы вы не добавляли прямоугольники в пользовательское представление, так как вам нужен один прямоугольник в один момент времени.
    • также, если не коснуться в течение некоторого времени, прямоугольник должен исчезнуть. сделайте это, используя обработчик из пользовательского вида.

Я даю вам здесь испытанный код, чтобы сделать это. я надеюсь, что это поможет вам. УДАЧИ.

private class CustomView extends SurfaceView { 

    private final Paint paint; 
    private final SurfaceHolder mHolder; 
    private final Context context; 

    public CustomView(Camera2BasicFragment context) { 
     super(context.getActivity().getBaseContext()); 
     mHolder = getHolder(); 
     mHolder.setFormat(PixelFormat.TRANSPARENT); 
     this.context = context.getActivity().getBaseContext(); 
     paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setColor(Color.WHITE); 
     paint.setStyle(Paint.Style.STROKE); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      invalidate(); 
      if (mHolder.getSurface().isValid()) { 
       final Canvas canvas = mHolder.lockCanvas(); 
       Log.d("touch", "touchRecieved by camera"); 
       if (canvas != null) { 
        Log.d("touch", "touchRecieved CANVAS STILL Not Null"); 
        canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
        canvas.drawColor(Color.TRANSPARENT); 
        canvas.drawCircle(event.getX(), event.getY(), 100, paint); 
        mHolder.unlockCanvasAndPost(canvas); 
        new Handler().postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          Canvas canvas1 = mHolder.lockCanvas(); 
          if(canvas1 !=null){ 
           canvas1.drawColor(0, PorterDuff.Mode.CLEAR); 
           mHolder.unlockCanvasAndPost(canvas1); 
          } 

         } 
        }, 1000); 

       } 
       mHolder.unlockCanvasAndPost(canvas); 


      } 
     } 


     return false; 
    } 
} 
+0

Sahil Reader: вы можете объяснить, как его добавить? на первом этапе я загрузил код Camera2Basic. могу ли я просто добавить этот класс в Camera2BasicFragment.java в пример кода с шага 1? – David

1

Я решил это - мне нужно было установить свой вид на поверхность drawColor (Color.TRANSPARENT) с четким флагом, и все было в порядке.

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