我想在Android CameraPreview上添加按钮。 基本上,层次结构如下:
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()方法。
答案 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);
中像我一样的魅力