我正在尝试创建一个相机应用程序。它主要基于官方教程。我的问题是创建一个具有正确宽高比的非全屏预览。来自sdk的"CameraPreview"示例创建了一个全屏预览。
尺寸和宽高比不会打扰我,但视频也会以错误的宽高比录制。
编辑以进行澄清: 我正在使用“CameraPreview”,因此我将所有调整大小和自动调整到位。如果我在例子中使用它:
setContentView(mPreview);
我得到了预览,但这是全屏。
我的问题是如何整合此预览类
public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback {
...
在给定的布局中。我想要一个小窗口进行预览(最好是可调整大小)。我需要知道如何进行整体布局。问题似乎是首先使用子项(和大小)创建主布局,然后测量预览的大小。
答案 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中使用它来确定相机预览宽度和高度