2017-06-25 110 views
1

我想借鉴使用基本Camera2从这个链接camera2预览矩形: https://github.com/googlesamples/android-Camera2Basic绘制矩形在camera2预览的android

,我跟着从论坛上的这个问题的答案:

android Camera2 API + TextureView overlay for drawing on camera preview

但我无法让它工作。如果你能帮我弄清楚如何解决我的问题,我将非常感激。下面是用于绘制矩形的类:Rectangle.java照相机的

package com.example.android.camera2basic; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.view.View; 

public class Rectangle extends View { 
Paint paint = new Paint(); 

public Rectangle(Context context) { 
    super(context); 
} 


@Override 
public void onDraw(Canvas canvas) { 
    paint.setColor(Color.GREEN); 
    paint.setStyle(Paint.Style.FILL); 
    Rect rect = new Rect(20, 56, 200, 112); 
    canvas.drawRect(rect, paint); 
} 
} 

xml文件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"> 

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

</FrameLayout> 

,这是在类,其中所使用的方法我将矩形添加到相机预览Camera2BasicFragment.java

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_camera2_basic, container, 
    false); 
    LinearLayout linearLayout = (LinearLayout) 
    view.findViewById(R.id.surface); 
    linearLayout.addView(new Rectangle(getActivity())); 
    return view; 
    } 

,并在启动粉碎申请后finaly出现错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.camera2basic/com.example.android.camera2basic.CameraActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.addView(android.view.View)' on a null object reference 
                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2793) 
                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864) 
                        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567) 
                        at android.os.Handler.dispatchMessage(Handler.java:105) 
                        at android.os.Looper.loop(Looper.java:156) 
                        at android.app.ActivityThread.main(ActivityThread.java:6523) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831) 
                       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.addView(android.view.View)' on a null object reference 
                        at com.example.android.camera2basic.Camera2BasicFragment.onCreateView(Camera2BasicFragment.java:431) 
                        at android.app.Fragment.performCreateView(Fragment.java:2361) 
                        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1000) 
                        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1178) 
                        at android.app.BackStackRecord.run(BackStackRecord.java:815) 
                        at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1585) 
                        at android.app.FragmentController.execPendingActions(FragmentController.java:371) 
                        at android.app.Activity.performStart(Activity.java:6929) 
                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2756) 
                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)  
                        at android.app.ActivityThread.-wrap12(ActivityThread.java)  
                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)  
                        at android.os.Handler.dispatchMessage(Handler.java:105)  
                        at android.os.Looper.loop(Looper.java:156)  
                        at android.app.ActivityThread.main(ActivityThread.java:6523)  
                        at java.lang.reflect.Method.invoke(Native Method)  
+1

'fragment_camera2_basic.xml'显然没有'R.id.surface' –

+0

谢谢先生!我设法弄清楚我的错误,感谢您的评论!我会将解决方案添加到 – user3816569

回答

2

所以感谢@ cricket_007评论我想通了我的错误。我正在将LinearLayout初始化为错误的xml文件。它应该是fragment_camera2_basic.xml

另外,管理,并得到了摄像头预览矩形,你应该这个代码后添加:

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

所以最终的XML文件看起来像这样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" /> 
    <LinearLayout 
     android:id="@+id/surface" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" /> 

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

PS:要设法使矩形填充使用这种在Rectangle.classpaint.setStyle(Paint.Style.STROKE);

+0

以下,您能分享您的解决方案吗?我在触摸事件上得到画布上的圆圈,但画布背景始终保持黑色... –

+0

我想通了。在CustomView类的构造函数中添加'this.setZOrderOnTop(true);' –