Как изменить время выполнения 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 делает его видимым при поступлении удаленного потока.

Другие вопросы по тегам