所以在我的应用程序中,我正在显示一个不占用整个屏幕的相机预览 . 我手动设置显示,但我的图像宽高比不正确 . 我将显示宽度设置为当前屏幕大小的一半 . 然后我想设置相对于宽度的高度并保持正确的图像宽高比 . 如何在保持正确比例的同时设置相机预览高度?
The AOSP Camera uses a PreviewFrameLayout作为预览的 SurfaceView 的包装器 . 他们根据他们从 Camera 中选择的预览大小的宽高比在 PreviewFrameLayout 上调用 setAspectRatio() ,并且 PreviewFrameLayout 相应地缩放 SurfaceView .
SurfaceView
Camera
PreviewFrameLayout
setAspectRatio()
由于 PreviewFrameLayout 是开源的,所以没有什么能阻止你将它克隆到你自己的项目中,正如我在this one中所做的那样 .
所以,在你的情况下,你将 PreviewFrameLayout 设置为所需的最大大小("half of the current screen size",我使用 LinearLayout 和 android:layout_weight 完成),教它纵横比,把 SurfaceView 放在 PreviewFrameLayout 中,你应该是很高兴去 .
LinearLayout
android:layout_weight
请注意,您应该能够在 SurfaceView 上设置 android:layout_gravity ,使其在 PreviewFrameLayout 中居中 .
android:layout_gravity
我用这个解决了问题
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; }
2 回答
The AOSP Camera uses a PreviewFrameLayout作为预览的
SurfaceView
的包装器 . 他们根据他们从Camera
中选择的预览大小的宽高比在PreviewFrameLayout
上调用setAspectRatio()
,并且PreviewFrameLayout
相应地缩放SurfaceView
.由于
PreviewFrameLayout
是开源的,所以没有什么能阻止你将它克隆到你自己的项目中,正如我在this one中所做的那样 .所以,在你的情况下,你将
PreviewFrameLayout
设置为所需的最大大小("half of the current screen size",我使用LinearLayout
和android:layout_weight
完成),教它纵横比,把SurfaceView
放在PreviewFrameLayout
中,你应该是很高兴去 .请注意,您应该能够在
SurfaceView
上设置android:layout_gravity
,使其在PreviewFrameLayout
中居中 .我用这个解决了问题