8

Im nuovo per lo sviluppo Android, e sto trovando difficile trovare buoni esempi sulla fotocamera2 api.Android SDK - camera2 - Disegna rettangolo su TextureView

Sto lavorando lentamente per la maggior parte dei problemi, ma su questo sono bloccato. Nella fotocamera predefinita, quando si sfiora lo schermo per mettere a fuoco, viene mostrato un rettangolo dell'area di messa a fuoco per un momento. Voglio fare qualcosa di simile (o in questo caso, la stessa identica cosa per iniziare, così posso capirlo).

Ho letto da qualche parte (penso che la pagina TextureView nei documenti dell'SDK) che non puoi disegnare su una vista texturizzata mentre è utilizzata come anteprima di una telecamera e chiamando il metodo di blocco restituirà null anziché una tela.

L'ho trovato online: https://github.com/commonsguy/vidtry/ Ma non riesco a farlo funzionare. O ottengo errori dicendo che la mia vista principale non può essere proiettata sulla mia vista disegnabile, o viceversa - O la mia vista disegnabile è in cima e rende lo schermo nero - O è in basso e non risponderà agli eventi di tocco (e tentando di forzare il performClick dalla vista sopra di esso casca crash.)

Im bloccato! Qualcuno può darmi una spiegazione o un esempio di come posso disegnare il mio rettangolo sulla posizione dell'evento per alcuni sconds?

Grazie!

+1

Non disegnare su TextureView. Metti una vista (per lo più trasparente) in cima e attingi a quella. – fadden

+0

Ho provato - non riuscivo a farlo funzionare. Puoi fare un esempio? – aescript

+0

Ok, quindi ho un'altra vista su di esso - tuttavia posso vedere solo la mia anteprima di cam se imposto questa vista alfa a 0 e bakcground: = "# 0000" ma poi non vedo il mio rettangolo .... anche se io prova a dargli l'alfa ...Sto facendo qualcosa di sbagliato o questo SDK è semplicemente terribilmente confuso rispetto a cose come GL/QT – aescript

risposta

4
  1. Prima ad esempio di camera2 api android esiste un codice di esempio google open source. https://github.com/googlesamples/android-Camera2Basic
  2. Seconda per la parte in cui si desidera disegnare un rettangolo (tocco per mettere a fuoco) attenersi alla seguente procedura -
    • Creare una classe personalizzata che si estende a SurfaceView.
    • chiama il metodo onTouchListener in questa classe personalizzata per rilevare le coordinate delle dita e disegnare il rettangolo utilizzando la classe paint in Android. -aggiungi questa classe personalizzata sopra il tuo TextureView che sta visualizzando l'anteprima da camera2.
    • trasforma la vista personalizzata trasparente.
    • infine, quando si tocca ad un certo punto sullo schermo del dispositivo, verrà chiamato onTouchListener che disegnerà sulla tela della vista personalizzata aggiunta sopra l'anteprima della fotocamera.
    • finalmente cancella il tuo quadro in modo da non continuare ad aggiungere rettangoli a customview poiché hai bisogno di un rect in un punto del tempo.
    • anche se non viene toccato per qualche tempo il rettangolo dovrebbe scomparire. fai questo usando un gestore dalla visualizzazione personalizzata.

sto dando qui un codice testato per fare questo. spero che ti aiuti BUONA FORTUNA.

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: puoi spiegare come aggiungerlo? nel primo passaggio ho scaricato il codice Camera2Basic. posso semplicemente aggiungere questa classe a Camera2BasicFragment.java nel codice di esempio dal passaggio 1? – David

1

L'ho risolto: ho dovuto impostare la vista di superficie per disegnare Colore (Colore TRASPARENTE) con una bandiera chiara e tutto andava bene.

Problemi correlati