Android相机预览始终显示在FrameLayout中的其他SurfaceView上方

时间:2012-11-10 17:44:51

标签: android android-camera

在Android 2.3应用程序中,我曾经支持两个摄像头:一个内置和外部MJPG流式传输使用Wi-Fi。内置摄像头必须始终录制视频,用户必须能够在这些视频之间切换视图。因此,每个相机都有一个专用的SurfaceView来绘制。由于添加到FrameLayout的最后一个子项具有更高的Z顺序,因此我以编程方式将所需的摄像机视图添加到最后的FrameLayout以使其可见。我无法跳过添加内置摄像头,因为它无法在没有预览显示的情况下录制视频。

此方案不再适用于Android 4:内置摄像头预览始终显示,无论是先添加还是最后添加。我在视图上使用'setVisibility'方法,并注意到如果其中一个视图被设置为不可见(或消失),则根本没有显示它们。 ViewGroup的'bringChildToFront'方法也没有效果。

那么,是否有一些解决方法可以在Android 4上运行?我知道有多个SurfaceView被认为是坏的。一些代码如下。

的FrameLayout:

<FrameLayout android:id="@id/data"
             android:layout_width="fill_parent" android:layout_height="fill_parent"/>

填充布局的代码(不再适用于Android 4):

private void setCorrectView() {
    data.removeAllViews();

    List<Recorder> others = recorders.getOthers();
    for (Recorder other : others) {
        addToTheView(other);
    }

    addToTheView(recorders.getCurrent());
}

private void addToTheView(Recorder recorder) {
    View view = recorder.getView(this); // get recorder's surface view
    data.addView(view);
}

如果我使用XML中的FrameLayouts,效果相同:

<FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent"
         xmlns:android="http://schemas.android.com/apk/res/android">

    <FrameLayout
        android:id="@id/data"
        android:layout_width="fill_parent" android:layout_height="fill_parent"/>

    <FrameLayout
        android:id="@+id/data_invisible"
        android:layout_width="fill_parent" android:layout_height="fill_parent"/>

</FrameLayout>

无论我将内置相机的表面视图放在哪里 - 它始终显示。看起来内部相机的预览现在总是在Android 4中排在首位。

1 个答案:

答案 0 :(得分:0)

回答自己。为了完成这项工作,我在启动相机之前将视图的可见性设置为View.VISIBLE ,并在之后将其设置为View.INVISIBLE This链接可能会有所帮助。