2017-05-27 8 views
0

Ich versuche, ein Rechteck über camera2 textureview zu zeichnen, wenn ich den Code ausführen, sehe ich die üblichen Kamera Bildschirm mit beweglichen Quadrat, und wenn ich klicke (touch) es stürzt App mit dem Fehler im Thema ab. Ich bin auch nicht sicher, dass ich die benutzerdefinierte Ansicht korrekt implementiert habe, hier sind alle relevanten Teile, würde einige Hilfe lieben (Ich bin mir nicht sicher, dass ich ein gutes Layout xml habe, fügte ich ViewGroup-Code unter OnCrearte, nicht sicher, ich muss sogar Xml berührenAndroid - CustomView - java.lang.IllegalStateException: Oberfläche wurde nicht gesperrt

)

-------CameraActivity.java:

package com.example.android.camera2video; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.ViewGroup; 

public class CameraActivity extends Activity { 
    private Context context; 
    CustomView customview; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera); 
     customview = new CustomView(this); 
     final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this.findViewById(android.R.id.content)).getChildAt(0); 
     viewGroup.addView(new CustomView(this)); 
     if (null == savedInstanceState) { 
      getFragmentManager().beginTransaction() 
        .replace(R.id.container, Camera2VideoFragment.newInstance()) 
        .commit(); 
     } 
    } 

} 

-------CustomView.java

package com.example.android.camera2video; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.PixelFormat; 
import android.graphics.PorterDuff; 
import android.os.Handler; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 




public class CustomView extends SurfaceView { 

    private Paint paint; 
    private SurfaceHolder mHolder; 
    private Context context; 

    public CustomView(Context context) { 
     super(context); 
     mHolder = getHolder(); 
     mHolder.setFormat(PixelFormat.TRANSPARENT); 
     this.context = context; 
     paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setColor(Color.WHITE); 
     paint.setStyle(Paint.Style.STROKE); 

    } 
    public CustomView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public CustomView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     // real work here 
    } 

    private void doAdditionalConstructorWork() { 

     // init variables etc. 
    } 
    @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"); 
       System.err.println("EXIT 1"); 
       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; 
    } 
} 

----- fragment_camera2_video.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.example.android.camera2video.AutoFitTextureView 
     android:id="@+id/texture" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" /> 


    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@id/texture" 
     android:background="#4285f4"> 

     <Button 
      android:id="@+id/video" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="@string/record" /> 

     <ImageButton 
      android:id="@+id/info" 
      android:contentDescription="@string/description_info" 
      style="@android:style/Widget.Material.Light.Button.Borderless" 
      android:layout_width="4dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical|right" 
      android:padding="20dp" 
      android:src="@drawable/ic_action_info" /> 

    </FrameLayout> 

</RelativeLayout> 
+0

Haben Sie eine Lösung gefunden? – Andrea

Antwort

0

Nur eine Sache kann zu einer Ansicht gleichzeitig gezeichnet werden; Sobald die SurfaceView mit der Kamera verbunden ist, können Sie sie nicht mehr für das Zeichnen selbst sperren.

Ihr Absturz ist wahrscheinlich, weil Sie mHolder.unlockCanvasAndPost (Leinwand) aufrufen; außerhalb des Null-Checks.

Wenn Sie die Cameara-Vorschau überzeichnen möchten, benötigen Sie eine zweite Ansicht, die über der Oberfläche platziert wird.

Verwandte Themen