如何获得在Surfaceview Android的普通相机的看法?(How to get norma

2019-10-21 02:29发布

现在,我在做一个示例应用程序在那里我有surfaceview使用相机。 我已经成功地设置surfaceview相机,但我在那里不能得到正常的摄像机视图,宽度和高度得到改变。 下面是我的代码,我很高兴得到任何人的任何想法。

Camera类:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);
            cameraObject = isCameraAvailiable();
    showCamera = new ShowCamera(this, cameraObject);
    preview.addView(showCamera);
            takePhotoButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
        cameraObject.takePicture(null, null, capturedIt);
        cameraObject.stopPreview();
        preview.removeView(showCamera);
        cameraObject.release();
        cameraObject = Camera.open();
        showCamera = new ShowCamera(Photo.this, cameraObject);

        preview.addView(showCamera);
        }
    });
}

SurfaceHolder类:

public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder holdMe;
private Camera theCamera;

public ShowCamera(Context context, Camera camera) {
    super(context);
    theCamera = camera;
    holdMe = getHolder();
    holdMe.addCallback(this);
}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    theCamera.stopPreview();
    theCamera.setDisplayOrientation(90);
    camWidth = width;
    camHeight = height;
    theCamera.startPreview();
    initPreview(width, height);
}

private void initPreview(int width, int height) {
    // Log.i(TAG, "initPreview()starts");

    if (theCamera != null) {
        try {
             Camera.Parameters param;
             param = camera.getParameters();
             param.setPreviewSize(176, 144);
             camera.setParameters(param);
            theCamera.setPreviewDisplay(holdMe);
        } catch (Throwable t) {
            Log.e("PreviewDemo-surfaceCallback",
                    "Exception in setPreviewDisplay()", t);
        }
    }

    // Log.i(TAG, "initPreview() ends");
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        theCamera.setDisplayOrientation(90);
        theCamera.setPreviewDisplay(holdme);
        theCamera.startPreview();
    } catch (IOException e) {
    }
}

public void surfaceDestroyed(SurfaceHolder arg0) {
    this.getHolder().removeCallback(this);
    theCamera.stopPreview();
    theCamera.release();
}

}

Framelayout.xml

<FrameLayout
    android:id="@+id/preview1"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:layout_alignParentLeft="true">

</FrameLayout>

Answer 1:

如果你希望你的无失真显示相机,你应该重写layout_height 预览框。 如果您知道该相机支持176×144预览大小,这是你真的想用什么,然后简单地设定预览的布局参数,

showCamera = new ShowCamera(this, cameraObject);

ViewGroup.LayoutParams lp = preview.getLayoutParams();
lp.width = getWindowManager().getDefaultDisplay().getWidth();
//*** no, this is wrong!! ***   lp.height = lp.width*144/176;
lp.height = lp.width*176/144; // that's correct for Camera.setDisplayOrientation(90) !!
preview.setLayoutParams(lp);

preview.addView(showCamera);


文章来源: How to get normal Camera view in Surfaceview android?