8

Ich bin neu in Android-Entwicklung, und ich finde es schwer, gute Beispiele auf der Kamera2 API zu finden.Android SDK - camera2 - Zeichnen Rechteck über TextureView

Ich arbeite mich langsam durch die meisten Probleme, aber auf dieser einen stecke ich fest. Wenn Sie in der Standardkamera auf den Bildschirm zum Fokussieren tippen, wird für einen Moment ein Rechteck des Fokusbereichs angezeigt. Ich möchte etwas Ähnliches machen (oder in diesem Fall genau die gleiche Sache, mit der ich anfangen kann, damit ich es herausfinden kann).

Ich habe irgendwo gelesen (ich glaube die TextureView-Seite in den SDK-Dokumenten), dass Sie nicht auf eine Texturansicht zeichnen können, während es als Kameravorschau verwendet wird - und das Aufrufen der Lock-Methode gibt null statt einer Zeichenfläche zurück.

Ich habe das online gefunden: https://github.com/commonsguy/vidtry/ Aber ich kann es nicht zur Arbeit bringen. Ich bekomme entweder Fehler, meine meine Hauptansicht kann nicht in meine Drawable View umgewandelt werden, oder umgekehrt - Oder meine Drawable View ist oben und macht den Bildschirm schwarz - Oder es ist auf der Unterseite und nicht auf Berührungsereignisse reagieren (und zu erzwingen versuchen das performClick aus der Ansicht darüber stürzt ab.)

Im stecken! Kann jemand mir eine Erklärung oder ein Beispiel geben, wie ich mein Rechteck für einige Sekunden über die Ereignisposition zeichnen kann?

Danke!

+1

Zeichnen Sie nicht auf der TextureView. Setzen Sie eine (meist transparente) Ansicht oben drauf und zeichnen Sie darauf. – fadden

+0

Ich versuchte - konnte das nicht zur Arbeit bekommen. Kannst du ein Beispiel geben? – aescript

+0

Okay, ich habe eine andere Ansicht darüber - aber ich kann nur meine Vorschau sehen, wenn ich diese Ansichten alpha auf 0 und bakcground: = "# 0000" aber dann kann ich nicht mein Rechteck sehen .... auch wenn ich versuche es und gebe es alpha ...Mache ich etwas falsch oder ist dieses SDK nur schrecklich verwirrend im Vergleich zu Dingen wie GL/QT – aescript

Antwort

4
  1. Zuerst zum Beispiel von camera2 api android gibt es eine Open Source Google Beispielcode. https://github.com/googlesamples/android-Camera2Basic
  2. SecondhandWir Teil, wo Sie ein Rechteck (Touch-Fokus) zeichnen möchten Sie folgendermaßen vor -
    • eine benutzerdefinierte Klasse erstellen zu Surface erstreckt.
    • Rufen Sie die TouchListener-Methode in dieser benutzerdefinierten Klasse auf, um Fingerkoordinaten zu erkennen und zeichnen Sie Ihr Rechteck mithilfe der Malklasse in android. - Fügen Sie diese benutzerdefinierte Klasse über Ihrer TextureView hinzu, die eine Vorschau von camera2 anzeigt.
    • drehen Sie die benutzerdefinierte Ansicht transparent.
    • schließlich, wenn Sie an einem Punkt auf dem Gerät Bildschirm berühren, dann onTouchListener wird aufgerufen, die auf der Leinwand der benutzerdefinierten Ansicht, die Sie über Ihre Kamera Vorschau hinzugefügt haben.
    • schließlich löschen Sie Ihre Zeichenfläche, so dass Sie nicht weiterhin Rechtecke zu customview hinzufügen, da Sie eine rect zu einem bestimmten Zeitpunkt benötigen.
    • auch wenn das Rechteck für einige Zeit nicht berührt wird, sollte das Rechteck verschwinden. Führen Sie dazu einen Handler aus der benutzerdefinierten Ansicht aus.

ich Ihnen hier einen getesteten Code gebe, dies zu tun. Ich hoffe es hilft dir. VIEL GLÜCK.

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: Können Sie erklären, wie Sie es hinzufügen? Im ersten Schritt habe ich den Camera2Basic-Code heruntergeladen. Kann ich diese Klasse einfach zu Camera2BasicFragment.java im Beispielcode aus Schritt 1 hinzufügen? – David

1

Ich löste es -Ich musste meine Oberflächenansicht auf drawColor (Color.TRANSPARENT) mit einer klaren Flagge einstellen und alles war in Ordnung.

Verwandte Themen