2014-09-18 19 views
5

Mi piacerebbe sapere come disegnare un rettangolo in una posizione e una dimensione specifica.Disegna rettangolo su SurfaceView

Ho provato un paio di prove ed esempi qui e sul web, ma niente ha funzionato per me.

Sto utilizzando SurfaceView e SurfaceHolder per tenere l'anteprima della fotocamera.

Voglio solo disegnare un rettangolo quando l'utente tocca lo schermo.

Non voglio usare la libreria esterna e quando sto cercando di ottenere la tela dal titolare sto diventando nulla.

Per ora non c'è il codice, perché niente funziona per me, se qualcuno ha la minima idea di come farlo, ci proverò.

Questo è quello che ho già provato:

Link 1

Link 2

Link 3

Grazie per l'aiuto!

+0

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

+0

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

risposta

5

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.

+4

FWIW, se le superfici di SurfaceView si sovrappongono, è necessario assegnare loro diverse profondità (ordini Z) utilizzando l'API di SurfaceHolder. Puoi vedere un'attività con tre software sovrapposti resi SurfaceViews nel test multi-superficie di Grafika (https://github.com/google/grafika/blob/master/src/com/android/grafika/MultiSurfaceActivity.java). – fadden

+0

In realtà, il codice sopra ha funzionato per me, ma hai ragione. È meglio lavorare con Zorder. – user2235615

+0

Sì, @fadden, non sono riuscito a ottenere il rettangolo anziché impostare il valore z come hai detto e ha funzionato perfettamente, grazie. – webmaster

Problemi correlati