当我调用mCamera.takePicture(null, null, null, null);
(为简单起见,我省略了回调)时,预览会冻结并显示刚刚捕获的场景的预览。为什么会这样。我可以以某种方式控制这种行为吗?而且,实际发生了什么?是否有附加的新视图或我的相机预览简单停止?
2 回答
实际发生了什么?是否有附加的新视图或者我的相机预览只是停止了?
默认情况下不会附加任何新视图。预览刚刚停止。的文档Camera
清楚地说明了这一点:
拍照后预览将停止;如果要重新开始预览或拍摄更多照片,调用者必须再次调用 startPreview()。
它还继续说:
调用此方法后,在 JPEG 回调返回之前,您不得调用 startPreview() 或拍摄另一张照片。
因此,再次调用的最佳位置startPreview()
是 JPEG 回调。在此之前的任何时间,相机硬件仍在处理之前的图像,并且无法为您提供预览。这是它“冻结”的主要原因;相机硬件很忙。
这也是对用户的视觉提示:
- 拍了一张照片
- 图片看起来像“这个”
这是锦上添花,但即使你不在乎,它仍然会这样做。
我可以以某种方式控制这种行为吗?
通过公开的 API?当然不。一旦相机完成处理(如上),您可以重新开始预览,但是当您调用takePicture()
.
是否有可能通过进一步研究相机固件,我真的不能说。但是,由于 Android 设备中使用的摄像头种类繁多,因此如果您不使用特定设备,这可能是徒劳的。
即使使用一种特定的设备,我也看不出你是如何完全克服它的。至少,相机将忙于处理图像一段时间。即使是我见过的高端数码单反相机,至少在曝光期间也会冻结预览。
调用 takePicture() 后,您可以将预览表面隐藏在另一个视图(例如 ImageView)下。如果您使用 OpenGL 而不是 SurfaceView 来渲染预览纹理,那么您的技巧就更多了。