如何在 android 中更改 surfaceview 的 z 顺序运行时
How to change surfaceview's z-order runtime in android
最近在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 说
注意这个必须在surface view包含之前设置
window 隶属于 window 经理。
那么这是否意味着我无法在运行时更改 SurfaceView z 顺序?
或者有什么破解方法吗?
抱歉我的英语不好。
编辑 1
SurfaceViewRender和PercentFrameLayout都来自库,SurfaceViewRender是SurfaceView 子类.
最后尝试了很多次,自己解决了
首先,我将 SurfaceViewRender
A 和 B 更改为 View.GONE
,然后从父布局中删除 A 和 B,setZOrderMediaOverlay
A 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);
最近在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 说
注意这个必须在surface view包含之前设置 window 隶属于 window 经理。
那么这是否意味着我无法在运行时更改 SurfaceView z 顺序?
或者有什么破解方法吗?
抱歉我的英语不好。
编辑 1
SurfaceViewRender和PercentFrameLayout都来自库,SurfaceViewRender是SurfaceView 子类.
最后尝试了很多次,自己解决了
首先,我将 SurfaceViewRender
A 和 B 更改为 View.GONE
,然后从父布局中删除 A 和 B,setZOrderMediaOverlay
A 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);