我正在Android上构建一个应用程序来从相机中取出帧,处理它们,然后在surfaceView上显示帧,以及通过画布和drawbitmap以及所有这些在SurfaceView上绘图。
只是要检查一下,SurfaceView和Bitmaps以及Canvases是最好的方法吗?我速度快了。
假设上述答案是肯定的,问题是:我应该在哪里放置以下功能
camera_object.setPreviewCallback(new PreviewCallback()
public void onPreviewFrame(byte[] data, Camera camera){
我应该将它放在onCreate()中还是应该将它放在surfaceCreated()或surfaceChanged()中?
我将mainactivity类声明如下:
public class MainActivity extends Activity implements SurfaceHolder.Callback, Camera.PreviewCallback
{
在那个类中,Eclipse强制我在MainActivity类中为onpreviewframe创建一个覆盖函数,如下所示
public void onPreviewFrame(byte[] data, Camera camera){
}
但它永远不会被调用。我应该尝试使用此功能吗?使用它更好吗?或者它只是一个Eclipse的东西?
请告知
答案 0 :(得分:7)
您是否从应用中调用了setPreviewDisplay(),startPreview()和setPreviewCallback(this)?没有它,你将无法调用onPreviewFrame()。实际上,如果您使用的是SurfaceView,则回调预览缓冲区是屏幕上显示的实际缓冲区的副本。因此,如果要显示这些复制的缓冲区,则需要创建一个新视图并覆盖它。这将是低效的。我建议您使用SurfaceTexture代替并使用'onFrameAvailable'回调来获取帧然后绘制&手动显示。可以在默认Android Camera App的PanoramaActivity代码中找到此示例。
答案 1 :(得分:1)
没有camera_object.setPreviewDisplay(surface_holder);
你就无法收到相机回调;别忘了
surface_view.setVisibility(View.VISIBLE);
surface_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
您可以在其他视图下隐藏相机预览;在3.0及更高版本中,您甚至可以将表面推出屏幕(将其显示在屏幕底部下方)。我不确定后一种技巧是否适用于2.3.6。