Android: 在屏幕旋转时保留相机预览,同时允许其他视图旋转。

5
我正在尝试构建一个定制的相机应用程序。我有一个扩展SurfaceView的类用于相机预览。当设备改变方向时,这个表面会被销毁和重新创建,导致明显的“闪烁”,影响用户体验。
我想做的是防止在方向改变时必须重新创建此相机预览。此外,我想在此预览上叠加一些按钮(例如闪光灯、前/后摄像头选择等),这些按钮会随着方向的改变而旋转。这与股票相机应用程序所做的类似: 横屏模式下的股票相机。 纵向模式下的股票相机。请注意,按钮在方向更改时会旋转。 我发现最好的方法(例如在这里中描述)是使用清单文件强制将活动方向设置为横向,一旦拍摄完毕,根据实际设备方向旋转所得到的图片。我理解这种方法的缺点是,这将防止覆盖按钮的旋转。另外,我已经了解了一些关于使用片段和保留片段实例的内容,我想知道是否可以通过保留包含相机预览的片段来实现我的目标(是的,我是一个新手)。
什么是正确的做法?
1个回答

5
如果您的清单没有声明活动处理方向更改,并且不锁定为单个方向,则设备旋转将导致整个活动被卸载并重新加载。这难道不是您现在体验到的吗?
如果您为活动指定了android:configChanges="orientation|screenSize",则用户体验将更加流畅。但是,即使如此,在此类旋转后仍无法保持相机预览“完好无损”;布局将被重建。
最后,股票相机应用程序的方法是设置固定(通常为横向)活动方向,并通过更改按钮和其他UI元素来伪造纵向方向。但是,如果您查找位于底部的系统通知或导航(软)按钮,则会发现实际上设备被锁定在横向,只有控件被重绘。您还会注意到相机应用程序避免使用标准文本小部件,因为此类小部件无法轻松旋转。
顺便说一句,您问题中还有一个误解。如果要将图片存储为纵向,则无论活动方向如何,都需要手动旋转JPEG。在大多数设备上,相机只能生成横向JPEG文件。相机API包括setRotation()方法,但通常,这只在JPEG标头中设置EXIF标志。并不是所有图像查看器都尊重此标志。如果您不想妥协,可能需要手动旋转图像。

股票相机与监听器似乎是最好的方法。但是,有没有可用的解决方案来使用OrientationListener旋转状态栏(通知、电池等)? - Blo
2
我刚刚在这个答案中找到了一种方法。使用方向监听器和configChanges选项,我能够重新组织视图而不使用默认的旋转动画。我在onLayout中设置了正确的位置并调用了invalidate。无论如何,谢谢;) - Blo
如果我理解正确的话,如果您拥有状态栏和/或导航栏,您无法禁用旋转动画。链接的解决方案仅适用于全屏Activity。 - Alex Cohn
@AlexCohn Google相机应用程序具有半透明的导航栏,即使状态栏不可见,您也可以从屏幕顶部拉出并看到它存在。如果在状态栏可见的情况下旋转设备,您会发现它会改变位置(显然)而无需重新创建活动。这正是我想要实现的。 - nitrico
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接