相机预览顶部的Android按钮

时间:2014-03-09 10:25:16

标签: android android-layout surfaceview viewgroup

我想在Android CameraPreview上添加按钮。 基本上,层次结构如下:

  • 活动
    • 的ViewGroup
      • SurfaceView

ViewGroup是SurfaceView的包装器,并以CameraPreview为中心。

我在Activity.java中的当前代码正在运行(没有按钮):

mPreview = new Preview(this, mCamera, mJavaDetector);
setContentView(mPreview);

现在我已经创建了布局,并希望在那里放置一个按钮。 我的布局main.xml如下所示:

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

    <LinearLayout
        android:id="@+id/preview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal"
        android:visibility="visible"
        android:layout_alignParentTop="true">
    </LinearLayout>

    <Button android:text="Freeze" android:id="@+id/someButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Button>      

</RelativeLayout>

我更改了Activity.java:

setContentView(R.layout.main); 
mPreview = new Preview(this, mCamera, mJavaDetector);

LinearLayout ll = (LinearLayout)findViewById(R.id.preview);
if(ll != null)
{
    ll.addView(mPreview);
}

在Preview.java中创建了SurfaceView

mCameraPreview = new CameraPreview(context, camera, mJavaDetector);
addView(mCameraPreview);

现在屏幕上只有按钮,但没有CameraPreview。你能告诉我我做错了什么吗?感谢。

修改

所以让我说我有这样的main.xml:

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


    <fit.vutbr.faceswap.Preview
        android:id="@+id/preview"  
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content">

        <fit.vutbr.faceswap.CameraPreview
            android:id="@+id/camerapreview"  
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content">
        </fit.vutbr.faceswap.CameraPreview>

    </fit.vutbr.faceswap.Preview>


    <ImageButton
        android:id="@+id/imageButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:src="@drawable/switch_100px_white" />     

</LinearLayout>

Inside Activity.java:

setContentView(R.layout.main);
mPreview = (Preview) findViewById(R.id.preview);
mPreview.setPreview(this, mCamera, mJavaDetector);

Inside Preview.java:

mCameraPreview = (CameraPreview) findViewById(R.id.camerapreview);
mCameraPreview.setCameraPreview(context, camera, mJavaDetector);

这里的错误在哪里?

EDIT2:

好的,事实证明,如果我像这样使用main.xml,我可以看到surfaceView:

<?xml version="1.0" encoding="utf-8"?>
<fit.vutbr.faceswap.Preview
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/preview"  
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:orientation="horizontal" >

   <!--  <ImageButton
            android:id="@+id/switch_camera_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@null"
            android:src="@drawable/switch_100px_white" />    
    -->        
    <fit.vutbr.faceswap.CameraPreview
        android:id="@+id/camerapreview"  
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content">
    </fit.vutbr.faceswap.CameraPreview>


</fit.vutbr.faceswap.Preview>

此外,我发现ViewGroup在添加新视图时使用了与其他布局相反的顺序,因此首先添加的是最多的。

现在,如果我取消注释ImageButton,我会在整个屏幕上显示按钮,并且从不调用SurfaceView的surfaceCreated()方法。

2 个答案:

答案 0 :(得分:2)

使用SurfaceView代替LinearLayout进行相机预览,如下所示......

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

    <SurfaceView
        android:id="@+id/cpPreview"
        android:layout_width="fill_parent" 
        android:layout_height="0dip"
        android:layout_weight="1"
        android:layout_gravity="center" />

   <Button android:text="Freeze" 
        android:id="@+id/someButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

然后初始化预览,如下所示......

  private SurfaceView preview=null;
  private SurfaceHolder previewHolder=null;
  private Camera camera=null;

  @Override
  public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

     setContentView(R.layout.main);

     preview = (SurfaceView)findViewById(R.id.preview);
     previewHolder = preview.getHolder();
     previewHolder.addCallback(surfaceCallback);
     previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  }

  @Override
  public void onResume() {
    super.onResume();

    camera=Camera.open();
    startPreview();
  }

This project可能对您有所帮助。

答案 1 :(得分:0)

我使用RelativeLayout完成了它:

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

<FrameLayout
    android:id="@+id/camera_preview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentBottom="true"
    android:text="Record baby!"/>

在活动相机预览(SurfaceView)中放入FrameLayout:

CameraPreview cameraPreview = new CameraPreview(this);
cameraPreviewFrame.addView(cameraPreview);

my app

中像我一样的魅力