2017-05-27 3 views
0

J'essaye de dessiner un rectangle sur camera2 textureview, quand je cours le code je vois l'écran normal de caméra avec le déplacement du carré, et quand je clique (touchez), l'application se bloque avec l'erreur dans le sujet. Je ne suis pas sûr que j'ai implémenté la vue personnalisée correctement, Voici toutes les parties pertinentes, J'adorerais de l'aide (Je ne suis pas sûr d'avoir une bonne mise en page xml, j'ai ajouté le code ViewGroup sous OnCrearte, je ne suis pas sûr d'avoir besoin de xml)Android - CustomView - java.lang.IllegalStateException: Surface n'a pas été verrouillé

-------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

Avez-vous trouvé une solution? – Andrea

Répondre

0

Une seule chose peut dessiner à une vue à la fois; Une fois que le SurfaceView est connecté à la caméra, vous ne pouvez pas le verrouiller pour le dessiner.

Votre plantage est probablement dû au fait que vous appelez mHolder.unlockCanvasAndPost (canvas); en dehors de la vérification null.

Si vous voulez dessiner l'aperçu de cameara, vous avez besoin d'une deuxième vue positionnée sur le SurfaceView.