不调用surfaceCreated

时间:2011-05-06 13:22:05

标签: android surfaceview

我正在尝试将相机预览(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(
}

3 个答案:

答案 0 :(得分:6)

当您在布局中声明SurfaceView时,您告诉Android使用内置类。您需要做的是通过将SurfaceView替换为your.package.name.CameraPreview来使用您的课程。

另一件事:您应该在CameraPreview参数ContextAttributeSet添加构造函数,否则布局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"
当然,不要忘记权限和功能。 希望它有所帮助。