如何创建一个正确的不全屏相机预览?

时间:2013-07-26 07:09:57

标签: android android-camera

我正在尝试创建一个相机应用程序。它主要基于官方教程。我的问题是创建一个具有正确宽高比的非全屏预览。来自sdk的"CameraPreview"示例创建了一个全屏预览。

尺寸和宽高比不会打扰我,但视频也会以错误的宽高比录制。

编辑以进行澄清: 我正在使用“CameraPreview”,因此我将所有调整大小和自动调整到位。如果我在例子中使用它:

setContentView(mPreview);

我得到了预览,但这是全屏。

我的问题是如何整合此预览类

public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback {
...

在给定的布局中。我想要一个小窗口进行预览(最好是可调整大小)。我需要知道如何进行整体布局。问题似乎是首先使用子项(和大小)创建主布局,然后测量预览的大小。

2 个答案:

答案 0 :(得分:0)

就个人而言,我使用这种方法:

private Point computePreviewSize(int pictureWidth, int pictureHeight,
        int screenWidth, int screenHeight){
    int resultWidth;
    int resultHeight;

    double widthRatio = pictureWidth / (double) screenWidth;
    double heightRatio = pictureHeight / (double) screenHeight;

    if(widthRatio > heightRatio){
        resultWidth = screenWidth;
        resultHeight = (int) (pictureHeight / widthRatio);
    }
    else{
        resultWidth = (int) (pictureWidth / heightRatio);
        resultHeight = screenHeight;
    }

    return new Point(resultWidth, resultHeight);
}

我在SurfaceChanged(在我的相机预览中)中调用它:

Point result = computePreviewSize(pictureWidth, pictureHeight, width, height);
holder.setFixedSize(result.x, result.y);

我可以拍照。我认为它也适用于视频。

答案 1 :(得分:0)

实际上,您可以使用我在相机预览中使用的相机参数来控制相机预览尺寸

public void surfaceCreated(SurfaceHolder holder) {
        camera = Camera.open();
        try {
            camera.setPreviewDisplay(holder);
            camera.setDisplayOrientation(90);
            Camera.Parameters parameters = camera.getParameters();
            camera.setPreviewCallback(new PreviewCallback() {

                public void onPreviewFrame(byte[] data, Camera arg1) {
                    Preview.this.invalidate();
                }
            });
            LayoutParams lparam = this.getLayoutParams();
            lparam.height = this.getHeight();
            lparam.width =  parameters.getPreviewSize().width;
            parameters.setPreviewSize(lparam.width, lparam.height);
            this.setLayoutParams(lparam);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

您还可以根据屏幕的高度和宽度修改高度,以便保持纵横比。您可以使用此功能实现此目的:

public static int getDisplayWidth(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay(); 
        int width = display.getWidth(); 

        return width;
    }

    public static int getDisplayHeight(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay(); 
        int height = display.getHeight(); 

        return height;
    }

然后在上面的surfaceCreated中使用它来确定相机预览宽度和高度