我正在尝试将相机预览(SurfaceView)与显示屏上的按钮放在一起,但我得到的只是一个空白屏幕,只显示按钮。如果我将SurfaceView设置为唯一的内容(使用setContentView(surfaceView),那么预览在屏幕上显示正常。我做错了什么?
提前致谢
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="0px"
android:layout_weight="1">
<SurfaceView
android:id="@+id/camera_surface"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/trigger"
android:id="@+id/trigger_picture_button"
android:layout_gravity="bottom" />
</FrameLayout>
</LinearLayout>
我的活动:
public class CameraActivity extends Activity {
private SurfaceView cameraPreview;
private Button triggerPicture;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera);
cameraPreview = (SurfaceView) findViewById(R.id.camera_surface);
triggerPicture = (Button) findViewById(R.id.trigger_picture_button);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
cameraPreview = new CameraPreview(this);
// setContentView(cameraPreview);
}
我的CameraPreview:
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder;
private Camera camera;
public CameraPreview(Context context) {
super(context);
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
camera = openFrontFacingCamera();
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
camera.release();
camera = null;
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
camera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
parameters.set("orientation", "portrait");
camera.setParameters(parameters);
camera.startPreview();
}
private Camera openFrontFacingCamera() {
// returns Camera.open(
}
答案 0 :(得分:6)
当您在布局中声明SurfaceView
时,您告诉Android使用内置类。您需要做的是通过将SurfaceView
替换为your.package.name.CameraPreview
来使用您的课程。
另一件事:您应该在CameraPreview
参数Context
和AttributeSet
添加构造函数,否则布局inflater将无法为您的类充气。此外,您不需要行cameraPreview = new CameraPreview(this);
。
答案 1 :(得分:1)
如果你的onCreate()是正确的,那么你将从xml中覆盖cameraPreview,并使用新创建的一个你永远不会添加到任何布局的(最后一行)。这意味着它永远不会膨胀,因此永远不会创造出表面。
答案 2 :(得分:-3)
也许这有点迟了,但它确实对我有用。
1,设置如下布局:
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
/>
<Button
android:id="@+id/button_capture"
android:text="Capture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
2,在onCreate:
// Create our Preview view and set it as the content of our activity.
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mPreview);
3,在Manifest.xml中:
android:screenOrientation="landscape"
当然,不要忘记权限和功能。
希望它有所帮助。