【发布时间】:2013-06-20 10:08:10
【问题描述】:
因此,在我的应用中,我正在显示一个不占用整个屏幕的相机预览。我正在手动设置显示,但我得到的图像纵横比不正确。我将显示宽度设置为当前屏幕尺寸的一半。然后我想设置相对于宽度的高度并保持正确的图像纵横比。如何在保持正确比例的同时设置相机预览高度?
【问题讨论】:
标签: java android image-processing android-camera
因此,在我的应用中,我正在显示一个不占用整个屏幕的相机预览。我正在手动设置显示,但我得到的图像纵横比不正确。我将显示宽度设置为当前屏幕尺寸的一半。然后我想设置相对于宽度的高度并保持正确的图像纵横比。如何在保持正确比例的同时设置相机预览高度?
【问题讨论】:
标签: java android image-processing android-camera
The AOSP Camera uses a PreviewFrameLayout 作为 SurfaceView 的包装器用于预览。他们根据从Camera 中选择的预览大小的纵横比在PreviewFrameLayout 上调用setAspectRatio(),PreviewFrameLayout 相应地缩放SurfaceView。
由于PreviewFrameLayout 是开源的,没有什么可以阻止您将其克隆到您自己的项目中,就像我在this one 中所做的那样。
因此,在您的情况下,您可以将 PreviewFrameLayout 设置为所需的最大尺寸(“当前屏幕尺寸的一半”,我希望您使用 LinearLayout 和 @ 987654333@),教它长宽比,把SurfaceView放在PreviewFrameLayout中,你应该很高兴。
请注意,您应该能够在SurfaceView 上设置android:layout_gravity 以使其在PreviewFrameLayout 中居中。
【讨论】:
FrameLayout 设置为屏幕宽度的50% 然后设置FrameLayout 高度和相机预览将自动填充它来做到这一点的更简单的方法
SurfaceView 的大小与相同的纵横比不同,图像将被拉伸。
我用这个解决了这个问题
private Camera.Size getBestPreviewSize(int width, int height)
{
Camera.Size result=null;
Camera.Parameters p = camera.getParameters();
for (Camera.Size size : p.getSupportedPreviewSizes()) {
if (size.width<=width && size.height<=height) {
if (result==null) {
result=size;
} else {
int resultArea=result.width*result.height;
int newArea=size.width*size.height;
if (newArea>resultArea) {
result=size;
}
}
}
}
return result;
}
【讨论】: