8

Android geliştirmeye yeni başladım ve camera2 api üzerinde iyi örnekler bulmakta zorlanıyorum.Android SDK - camera2 - TextureView üzerinde dikdörtgeni çizin

Yolculuğumu yavaş yavaş çoğu sorunla uğraşıyorum, ama üzerinde takılıyorum. Varsayılan kamerada, odaklanmak için ekrana dokunduğunuzda, bir an için odak alanının dikdörtgenini gösterir. Benzer bir şey yapmak istiyorum (ya da bu durumda, başlamak için tam olarak aynı şey bu yüzden bunu anlayabiliyorum).

Bir kamera önizlemesi olarak kullanılırken doku görüntüsünü çizemediğiniz bir yere (SDK belgelerinde TextureView sayfası olduğunu düşünüyorum) hatırlıyorum ve kilit yöntemini çağırmak bir tuval yerine boş değer döndürecek.

Çevrimiçiyim: https://github.com/commonsguy/vidtry/ Ama işe yaramayacağım. Ya benim ana görüşümün benim çekilebilir görüşüme dönüştürülemeyeceğini söyleyen hatalar alıyorum ya da tam tersi - Ya da benim çekilebilir görüşüm üstte ve ekranı siyah yapıyor - Ya da altta ve dokunma olaylarına tepki vermeyecek (ve zorlamaya çalışıyor) Yukarıdaki görünümden performClick, kasaların çökerttiğini gösterir.)

Im sıkışmış! Herkes bana birkaç saniyeliğine olay konumumdan dikdörtgeni nasıl çizebileceğime dair bir açıklama veya örnek verebilir mi?

Teşekkürler!

+1

TextureView üzerinde çizim yapmayın. Üstüne (çoğunlukla şeffaf) bir Görünüm koyun ve üzerine çizin. – fadden

+0

Denedim - işe yaramazdı. bir örnek verebilir misin? – aescript

+0

Tamam, bunun üzerine başka bir görünümüm var - ancak bu görüntüleme alfa'yı 0 ve bakcground: = "# 0000" olarak ayarlıyorum ancak sonra dikdörtgeni göremediğimde sadece kam önizlemesini görebilirim. deneyin ve alfa ver ...Yanlış bir şey yapıyorum ya da bu SDK sadece GL/QT – aescript

cevap

4
  1. İlk olarak camera2 API android için bir açık kaynak kodlu google örnek kodu vardır. Eğer (odaklamak için dokunma) bir dikdörtgen çizmek istiyorum Bölümü için https://github.com/googlesamples/android-Camera2Basic
  2. İkinci aşağıdaki adımları izleyin -
    • SurfaceView kadar uzanan özel bir sınıf oluşturun.
    • Bu özel sınıfta, parmak koordinatlarını algılamak ve androidde boya sınıfını kullanarak dikdörtgeni çizmek için bu özel sınıftaTouchListener yöntemini çağırın. -bu özel sınıfı, Camera2 öğesinden önizlemeyi görüntüleyen TextureView'unuzun üstüne ekleyin.
    • Özel görünümü şeffaflaştırır.
    • nihayet cihaz ekranında bir noktaya dokunduğunuzda, kamera önizlemesinin üzerine eklediğiniz özel görünümün tuvaline çekilecek olan onTouchListener çağrılacaktır.
    • nihayet tuvalinizi temizleyin, böylece bir defada bir doğrultuya ihtiyaç duyduğunuzdan, özel görünüme dikdörtgenler eklemeyin.
    • Ayrıca bir süreye dokunulmazsa dikdörtgen diker. Özel görünümden bir işleyici kullanarak bunu yapın.

Bunu yapmak için buraya bir test kodu size veriyorum. Umarım size yardımcı olur. İYİ ŞANSLAR.

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 Okuyucu: Nasıl ekleyeceğinizi açıklayabilir misiniz? Birinci adımda Camera2Basic kodunu indirdim. Bu sınıfı yalnızca 1. adımdaki örnek kodda Camera2BasicFragment.java'ya ekleyebilir miyim? – David

1

Bunu çözdüm -Görünüm görünümünü açık bir bayrakla drawColor (Color.TRANSPARENT) olarak ayarladım ve her şey yolundaydı.