2014-09-18 5 views
5

Я хотел бы знать, как рисовать прямоугольник в определенном положении и размере.Draw Rectangle on SurfaceView

Я пробовал пару испытаний и примеров здесь и в Интернете, но ничего не работало для меня.

Я использую SurfaceView и SurfaceHolder для предварительного просмотра камеры.

Я просто хочу нарисовать прямоугольник, когда пользователь коснется экрана.

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

На данный момент нет кода, потому что ничего не работает для меня, если кто-то знает, как это сделать, я попробую.

Это то, что я уже пробовал:

Link 1

Link 2

Link 3

Спасибо за помощь!

+0

Данная поверхность SurfaceView может иметь только один «производитель». Поскольку камера рисует его, вы также не можете рисовать его с помощью Canvas. Вам нужно опираться на другую поверхность; наиболее эффективным вариантом будет использование прозрачного представления. Другим подходом было бы отправить камеру в SurfaceTexture и отобразить ее с помощью GLES, что даст вам полную свободу. См. «текстура с камеры» на https://github.com/google/grafika. – fadden

+0

Можете ли вы привести пример, как создать прозрачный вид? Все, что я нашел, это примеры, которые показывают только прямоугольник и устанавливают представление как * setContentView (drawView); * так, что я не вижу камеру. – user2235615

ответ

5

Хорошо, спасибо fadden Я нашел самое простое решение (по крайней мере, для меня).

Сначала я создал другой вид поверхности, и мой файл XML выглядит следующим образом:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scrollView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:opencv="http://schemas.android.com/apk/res-auto" 
    android:layout_gravity="left|top"> 
     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" > 

        <SurfaceView 
         android:layout_alignParentTop="true" 
         android:id="@+id/CameraView" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" /> 
        <SurfaceView 
         android:layout_alignParentTop="true" 
         android:id="@+id/TransparentView" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" /> 
      </RelativeLayout> 
</RelativeLayout> 

И чем я создал еще один держатель для новой поверхности, это часть моего кода Java:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_video_capture); 
     // Create first surface with his holder(holder) 
     cameraView = (SurfaceView)findViewById(R.id.CameraView); 
     cameraView.setOnTouchListener(onTouchListner); 

     holder = cameraView.getHolder(); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     // Create second surface with another holder (holderTransparent) 
     transparentView = (SurfaceView)findViewById(R.id.TransparentView); 

     holderTransparent = transparentView.getHolder(); 
     holderTransparent.setFormat(PixelFormat.TRANSPARENT); 
     holderTransparent.addCallback(callBack); 
     holderTransparent.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

Наконец я реализовать метод, называемый «DrawFocusRect»

private void DrawFocusRect(float RectLeft, float RectTop, float RectRight, float RectBottom, int color) 
{ 

    canvas = holderTransparent.lockCanvas(); 
    canvas.drawColor(0,Mode.CLEAR); 
    //border's properties 
    paint = new Paint(); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setColor(color); 
    paint.setStrokeWidth(3); 
    canvas.drawRect(RectLeft, RectTop, RectRight, RectBottom, paint); 


    holderTransparent.unlockCanvasAndPost(canvas); 
} 

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

Это, как я взываю к этому методу от события А «OnTouchListener»:

OnTouchListener onTouchListner = new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
        RectLeft = event.getX() - 100; 
        RectTop = event.getY() - 100 ; 
        RectRight = event.getX() + 100; 
        RectBottom = event.getY() + 100; 
        DrawFocusRect(RectLeft , RectTop , RectRight , RectBottom , Color.BLUE); 
      } 
     }; 

Надеется, что это будет полезно для кого-то других.

+4

FWIW, если поверхности SurfaceView перекрываются, вам необходимо дать им разные глубины (заказы Z) с использованием API SurfaceHolder. Вы можете увидеть Activity с тремя перекрывающимися программно-визуализированными SurfaceViews в многоповерхностном тесте Grafika (https://github.com/google/grafika/blob/master/src/com/android/grafika/MultiSurfaceActivity.java). – fadden

+0

Собственно, код выше работал для меня, но вы правы. Лучше работать с Zorder. – user2235615

+0

Да @fadden, я просто не мог добиться, чтобы работать с прямоугольником, чем установить значение z, как вы упомянули, и это сработало отлично, спасибо. – webmaster