Android:在方向更改时保留相机预览,而其他视图可以旋转

时间:2016-03-07 15:06:48

标签: android android-fragments android-camera android-orientation

我正在尝试构建自定义相机应用。我有一个类,它扩展了SurfaceView以进行相机预览。当设备改变方向时,该表面将被破坏并重新创建,从而导致明显的“故障”,从而降低用户体验。

我想做的是防止必须在方向更改时重新创建此相机预览。另外,我希望有一些按钮覆盖这个预览(例如闪光灯,前/后摄像头的选择等),它们会在方向改变时旋转。这类似于相机应用程序的功能:

Stock camera in landscape mode.

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

我找到的最佳方法(例如,描述为here)是使用清单文件强制将活动方向设置为横向,并且一旦拍摄照片,根据实际设备方向旋转生成的图片。据我所知,这种方法的缺点是,这也会阻止重叠按钮的旋转。或者,正如我已经阅读了一些关于使用片段和保留片段实例的内容,我想知道我是否可以通过保留包含相机预览的片段来实现我的目标(是的,我是菜鸟)。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

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

如果您为活动指定android:configChanges="orientation|screenSize",则用户体验会更加顺畅。但是,你仍然不能保持相机的预览和完整的#34;经过这样的轮换;布局将重建。

最后,相机应用程序的方法是设置固定(通常是横向)活动方向,并通过更改按钮和其他UI元素来伪造纵向方向。但是,如果您在底部查找系统通知或导航(软)按钮,您将了解实际设备已锁定在横向中,仅重绘了控件。您还会注意到相机应用程序避免使用标准文本小部件,因为这些小部件无法轻松轮换。

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