4

最近我在android中学习了webrtc。

我想单击SurfaceView A 使其全屏,另一个SurfaceView B 变小,或者单击 B。但我发现在运行时很难更改两个不同表面视图的 z 顺序。

这是我的布局

<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/app_bar_main">

<org.webrtc.PercentFrameLayout
    android:id="@+id/remote_video_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <org.webrtc.SurfaceViewRenderer
        android:id="@+id/remote_video_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</org.webrtc.PercentFrameLayout>

<org.webrtc.PercentFrameLayout
    android:id="@+id/local_video_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <org.webrtc.SurfaceViewRenderer
        android:id="@+id/local_video_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:keepScreenOn="true" />

</org.webrtc.PercentFrameLayout>


PercentFrameLayout 是一个 ViewGroup 子类,用于测量屏幕的百分比。
我曾尝试在运行时使用 setZOrderMediaOverlay 但失败了。我发现 SDK 说

请注意,这必须在表面视图的包含窗口附加到窗口管理器之前设置。


那么这是否意味着我不能在运行时更改SurfaceView z-order?或者有什么办法破解它?

对不起,我的英语不好。



编辑 1 SurfaceViewRender
PercentFrameLayout来自库,SurfaceViewRenderSurfaceView的子类。

4

1 回答 1

4

最后,我尝试了很多次,自己解决了。

首先,我将SurfaceViewRenderA 和 B 更改为View.GONE,然后从父布局中删除 A 和 B,setZOrderMediaOverlayA false 和 B true 或 A true 和 B false。左边的台阶刚刚倒过来。

就像下面这样。

    mLocalRender.setVisibility(View.GONE);
    mRemoteRender.setVisibility(View.GONE);
    mLocalRenderLayout.removeView(mLocalRender);
    mRemoteRenderLayout.removeView(mRemoteRender);
    mLocalRender.setZOrderMediaOverlay(mLocalPreview);
    mRemoteRender.setZOrderMediaOverlay(!mLocalPreview);
    mLocalRenderLayout.addView(mLocalRender, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    mRemoteRenderLayout.addView(mRemoteRender, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    mLocalRender.setVisibility(View.VISIBLE);
    mRemoteRender.setVisibility(View.VISIBLE);
于 2016-05-23T14:41:57.803 回答