我已经使用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的Samsung Galaxy Note 2 LTE上测试该应用程序。

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

最佳答案

该链接可能有帮助: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();


那对你有用吗?

10-01 00:24