Как изменить время выполнения Z-порядка SurfaceView в Android
Недавно я изучал webrtc в Android.
Я хочу щелкнуть 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 говорит
Обратите внимание, что это должно быть установлено до того, как окно, содержащее вид поверхности, присоединено к диспетчеру окон.
Так значит ли это, что я не могу изменить z-порядок SurfaceView во время выполнения? Или есть способ взломать его?
Извините за мой плохой английский.
Редактировать 1
И SurfaceViewRender, и PercentFrameLayout взяты из библиотеки, SurfaceViewRender является подклассом SurfaceView.
2 ответа
Наконец я много раз пробовал и решил это сам.
Сначала я меняю SurfaceViewRender
А и Б к View.GONE
затем удалите A и B из родительского макета, setZOrderMediaOverlay
Ложь и Б правда или Б правда и Б ложь. Левые шаги просто поменялись местами.
Просто посмотрите, как показано ниже.
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);
Я решил ту же проблему другим способом. Мои представления были в CoordinatorLayout. Оба были настроены наGONE
в xml. Затем изFragment::onViewCreated
mRemoteVideoView.init(mRootEglBase.getEglBaseContext(), null);
mRemoteVideoView.setZOrderMediaOverlay(false);
mLocalVideoView.init(mRootEglBase.getEglBaseContext(), null);
mLocalVideoView.setZOrderMediaOverlay(true);
mLocalVideoView.setVisibility(View.VISIBLE);
Обратите внимание, что mRemoteVideoView здесь не отображается. Платформа WebRTC делает его видимым при поступлении удаленного потока.