3

我正在尝试构建自定义相机应用程序。我有一个为相机预览扩展SurfaceView的类。当设备改变方向时,该表面被破坏并重新创建,导致明显的“故障”,从而降低用户体验。Android:保留相机预览方向更改,而其他视图可以旋转

我想要做的就是防止在取向改变时重新创建相机预览。另外,我想在这个预览上覆盖一些按钮(例如,闪光灯,前/后相机的选择等),其将在方向改变时旋转。这类似于股票相机应用做什么:

Stock camera in landscape mode.

Stock camera in portrait mode. Note that buttons rotate on orientation change.

我发现(例如描述,here)最好的方法是使用清单文件中的活动方向,以迫使景观,拍摄照片后,根据实际的设备方向旋转结果图像。据我所知,这种方法的缺点是这也会阻止重叠按钮的旋转。另外,正如我已经读了一些关于使用片段和保留片段实例,我想知道我是否可以通过保留包含相机预览的片段(是的,我是一个noob)来实现我的目标。

什么是正确的方法来做到这一点?

回答

4

如果您的清单没有声明活动处理方向更改,并且未锁定到单个方向,则设备的旋转将导致整个活动被卸载并重新加载。这不是你现在体验到的吗?

如果您为自己的活动指定了android:configChanges="orientation|screenSize",那么用户体验将会更平滑。但是,在这种旋转之后,您仍然无法保持相机预览“完好无损”;布局将被重建。

最后,股票相机应用程序的方法是通过更改按钮和其他UI元素来设置固定(通常是风景)活动方向并伪造肖像方向。但是,如果您查看底部的系统通知或导航(软)按钮,则会明白实际设备已锁定在横向上,只有控件重新绘制。您还会注意到相机应用程序会避免使用标准文本小部件,因为这些小部件无法轻松旋转。

顺便说一下,您的问题还有另一个误解。如果您想将图片存储为肖像,无论您的活动方向如何,您都需要(或不需要)手动旋转JPEG。在大多数设备上,相机只能生成横向JPEG文件。 Camera API包括setRotation()方法,但通常这只在JPEG标头中设置EXIF标志。并非所有图像浏览者都尊重这个标志。如果您不想妥协,您可能需要手动旋转图像。

+0

谢谢。你说股票相机应用程序“通过更改按钮和其他UI元素来伪造肖像方向”,他们是如何做到的?我猜他们在清单中为此活动设置了'android:screenOrientation =“landscape”',但是如何旋转UI元素呢? – nerdelicious

+0

他们有一个OrientationListener,当他们检测到设备已转向纵向时,他们旋转按钮图标。你可以在开源库存[Camera app](https://android.googlesource.com/platform/packages/apps/Camera.git)和[Open camera](https://github.com)/almalence/OpenCamera) –

+0

与听众的股票摄像头似乎是最好的方法。但是,是否有任何可用的解决方案来使用OrientationListener旋转状态栏(通知,电池等)? – Fllo