2017-05-26 544 views
3

因此,我需要叠加camera2预览,并在预览视频图像上绘制一个矩形,方法是在顶部叠加一个透明叠加层。我从这里开始了一个基本的Camera2代码:https://github.com/googlesamples/android-Camera2Basicandroid Camera2 API + TextureView叠加在相机预览上绘图

以上使用TextureView进行相机预览。

接下来,我添加了下面的类项目

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

我需要使这项工作。显然新类尚未使用一些帮助。我还需要更新叠加层xml以在相机预览之上添加第二个透明TextureView。这是我的原始布局: 如果有人能告诉我如何让新班级工作,并告诉我要添加到布局中,应该非常感激。

这里是fragment_camera2_basic.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.example.android.camera2basic.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:id="@+id/control" 
     android:layout_width="match_parent" 
     android:layout_height="112dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentStart="true" 
     android:background="@color/control_background"> 

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

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

    </FrameLayout> 

</RelativeLayout> 

和activity_camera.xml

<?xml version="1.0" encoding="utf-8"?><!-- 

--> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#000" 
    tools:context="com.example.android.camera2basic.CameraActivity" /> 

回答

3

添加

<LinearLayout 
    android:id="@+id/surface" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" /> 

内片段。我已经在AutoFitTextureView和FrameLayout中添加了一个RelativeLayout,但不确定是否需要。

变化onCreateView到

View view = inflater.inflate(R.layout.fragment_camera2_basic, container, false); 

LinearLayout surface = (LinearLayout)view.findViewById(R.id.surface); 
surface.addView(new CustomView(this)); 

return view; 
+0

是的,这工作,thankU – David