Ok, grazie a Fadden ho trovato la soluzione più semplice (almeno per me).
Per prima cosa ho creato un altro superficie vista e il mio file XML simile a questa:
<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>
E quanto mi sono creato un altro supporto per la nuova superficie, questa è una parte del mio codice 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);
}
Finalmente implementare un metodo chiamato '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);
}
Come potete vedere, ho chiaro il tela ogni volta, se non lo faccio, la superficie mostrerà in aggiunta più rettangoli l'uno sull'altro.
Questo è come io chiamo a questo metodo dall'evento un '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);
}
};
Spero che questo sarebbe utile per qualcun altro.
Una superficie SurfaceView determinata può avere solo un "produttore". Poiché la fotocamera sta disegnando su di essa, non puoi disegnare su di essa con una tela. Devi disegnare su una superficie diversa; opzione più efficiente sarebbe usare una vista trasparente. Un altro approccio sarebbe quello di inviare la fotocamera a SurfaceTexture e renderla con GLES, che ti dà piena libertà. Vedi per es. "texture dalla fotocamera" su https://github.com/google/grafika. – fadden
Puoi darmi un esempio su come creare una vista trasparente? Tutto quello che ho trovato sono esempi che mostrano solo il rettangolo e impostano la vista come * setContentView (drawView); * così non riesco a vedere la telecamera. – user2235615