不调用surfaceCreated

Han*_*uff 6 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>
Run Code Online (Sandbox Code Playgroud)

我的活动:

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);
    }
Run Code Online (Sandbox Code Playgroud)

我的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(
}
Run Code Online (Sandbox Code Playgroud)

Mal*_*olm 6

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

还有一两件事:你应该添加一个构造函数的CameraPreview服用参数ContextAttributeSet,否则布局吹气将无法充气类.你也不需要这条线cameraPreview = new CameraPreview(this);.