0

我正在尝试创建一个相机应用程序。它主要基于官方教程。我的问题是创建具有正确纵横比的非全屏预览。sdk中的“CameraPreview”示例创建全屏预览。

大小和纵横比不会打扰我,但视频也是以错误的纵横比录制的。

编辑澄清: 我正在使用“CameraPreview”,所以我有所有的调整大小和自动调整大小。如果我像示例中那样使用它:

setContentView(mPreview);

我得到了一个工作预览,但这是全屏的。

我的问题是如何整合这个预览课

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

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

4

2 回答 2

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);

拍照对我有用。我认为它也应该适用于视频。

于 2013-07-26T07:35:56.040 回答
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中使用它来确定相机预览的宽高

于 2013-07-26T07:41:38.173 回答