无法在自定义SurfaceView类之上绘制

时间:2013-03-13 16:25:56

标签: android android-camera surfaceview android-view

我已经使用example guide创建了一个名为CameraPreview的类,它继承自SurfaceView类,并显示相机预览。我还创建了另一个名为DrawOnTop的自定义视图类,它直接从View继承,我使用它来在预览的顶部绘制文本和其他项目。每个视图类本身都可以正常工作,但是当我将两个视图加载到活动中时,CameraPreview始终占主导地位,并且DrawOnTop类中的任何对象或文本都不会出现在相机预览的顶部。

因为我正在使用两个自定义视图类,所以我不打算在活动的onCreate中从XML中扩展任何视图类,因此onCreate不包含对setContentView(...)的任何调用。相反,我实例化每个视图类,并使用addContentView(...)将每个视图对象加载到活动的根视图中,即

CameraPreview preview = new CameraPreview(this); 
addContentView(preview, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));

DrawOnTop drawontop = new DrawOnTop(this);       
addContentView(drawontop, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
drawontop.setVisibility(View.VISIBLE);
drawontop.bringToFront();

我查看了活动的根视图,结果是FrameLayout类型。正如我上面所说,这种方法可以自己适用于每个视图。

为了让DrawOnTop类出现在相机预览的顶部,我尝试使用了bringToFront(),但它没有任何效果。我在运行Android 4.1.1的三星Galaxy Note 2 LTE上测试应用程序。

谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:3)

此链接可能有所帮助:How to draw an overlay on a SurfaceView used by Camera on Android?

您只需将您的CameraPreview视图放入FrameLayout,并使您的DrawOnTop视图与FrameLayout处于同一级别,即

FrameLayout frame = new FrameLayout(this);
addContentView(frame, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
CameraPreview preview = new CameraPreview(this); 
frame.addView(mPreview);

DrawOnTop drawontop = new DrawOnTop(this);       
addContentView(drawontop, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
drawontop.setVisibility(View.VISIBLE);
drawontop.bringToFront();

这对你有用吗?