置于SurfaceView上的SurfaceView

4
我正在使用两个MjpegView(自定义视图,扩展了SurfaceView)构建一个应用程序。问题是有时候我看不到第二个摄像头视图,因为它在第一个摄像头视图后面。流媒体工作正常,我尝试更改相机视图在布局内的位置,但没有成功,还尝试将第二个相机置于最前面。
以下是布局代码:
谢谢。
  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/visul_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/camera_border"
        android:padding="2dp" >

        <TextView
            android:id="@+id/no_visu_stream"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="@string/measurment_no_stream"
            android:textColor="@android:color/white"
            android:textSize="25sp" />

         <com.example.test.views.MjpegView
            android:id="@+id/sh_surface"
            android:layout_alignParentBottom="true"
            android:layout_width="150dp"
            android:layout_height="150dp"
            android:visibility="gone" />

        <com.example.test.views.MjpegView
            android:id="@+id/visul_surface"
            android:layout_width="match_parent"
            android:layout_margin="2dp"
            android:layout_height="500dp"
            android:visibility="gone" />

        <ImageView
            android:id="@+id/cible"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:background="@drawable/cible"
            android:visibility="gone" />


        <TextView
            android:id="@+id/no_sh_stream"
            android:layout_width="150dp"
            android:layout_height="150dp"
            android:layout_centerInParent="true"
            android:text="@string/measurment_no_stream"
            android:textColor="@android:color/white"
            android:textSize="14sp" />



    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/eye_left_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="15dp"
        android:padding="10dp" >

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/motor_arrow_selector_left" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/eye_right_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="15dp"
        android:padding="10dp" >

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/motor_arrow_selector_right" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/eye_up_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="15dp"
        android:padding="10dp" >

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/motor_arrow_selector_up" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/eye_down_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="15dp"
        android:padding="10dp" >

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/motor_arrow_selector_down" />
    </RelativeLayout>


    <ImageView
        android:id="@+id/disable_camera_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/disable_camera_layout"
        android:clickable="true"
        android:visibility="gone" />

</RelativeLayout>
1个回答

11

我不确定这是一个简单的布局问题还是与重叠的SurfaceView表面有关的问题; 我将把它视为后者。

SurfaceView表面存在于单独的层中,独立于用于呈现View层次结构的图形层。 SurfaceView的“视图”部分只是一个透明的孔,让您通过View层看到Surface(s)。

每个Surface层都具有Z顺序。 如果两个Surface尝试占用相同的空间,则其中一个将获胜,并且获胜者并不完全确定。 您可以通过显式设置一个Surface的Z顺序来解决此问题。 setZOrderMediaOverlay()调用将将该层定位在默认表面位置之上,但在View层之下。 setZOrderOnTop()将将表面置于View UI之上。 必须在创建表面之前进行调用(例如,在onCreate()中)。

例如,在 Grafika 中查看 "多表面测试" 活动。

当我使用每个功能时,每个视图都覆盖第二个视图,每次只能看到其中一个。我需要同时看到它们两个。 - visionix visionix
你是否使用 setFormat() 将表面设置为透明,用透明颜色清除它们,并保留部分透明?(再次参考 Grafika 示例。) - fadden
最后我在较小的相机视图中添加了setZOrderMediaOverlay,目前看起来似乎可以工作,感谢您的帮助! - visionix visionix
嘿@fadden,我遇到了同样的问题,你的答案帮了我很大的忙。非常感谢,但是还有一个问题。我正在动态地将surfaceview添加到一个framelayout中,并启用了setZOrderMediaOverlay(),但是表面没有在framelayout内部呈现,而是在其上方呈现。你能帮我解决一下吗? - Anvesh Arrabochu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接