Sinch местная камера всегда остается на вершине - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть это представление для отображения видео

<FrameLayout
    android:id="@+id/remoteViewLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/remote_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <RelativeLayout
        android:id="@+id/local_view"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_gravity="bottom|right" />
</FrameLayout>

После нажатия на local_view мне нужно удалить виды из обоих RelativeLayout и снова добавить их в другое положение.Я использую флаг, чтобы узнать текущие загруженные представления.

private String loadedView = "1";

binding.contentSinchIncomingCall.localView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        if (videoController == null) {
            videoController = mSinchServiceInterface.getVideoController();
        }

        if (loadedView.equals("1")) {
            loadedView = "2";

            ((ViewGroup) videoController.getLocalView().getParent()).removeView(videoController.getLocalView());
            ((ViewGroup) videoController.getRemoteView().getParent()).removeView(videoController.getRemoteView());

            binding.contentSinchIncomingCall.remoteView.addView(videoController.getLocalView());
            binding.contentSinchIncomingCall.localView.addView(videoController.getRemoteView());

            binding.contentSinchIncomingCall.localView.requestLayout();
            binding.contentSinchIncomingCall.localView.invalidate();
            binding.contentSinchIncomingCall.remoteViewLayout.bringChildToFront(binding.contentSinchIncomingCall.localView);

        } else {
            loadedView = "1";

            ((ViewGroup) videoController.getLocalView().getParent()).removeView(videoController.getLocalView());
            ((ViewGroup) videoController.getRemoteView().getParent()).removeView(videoController.getRemoteView());

            binding.contentSinchIncomingCall.remoteView.addView(videoController.getRemoteView());
            binding.contentSinchIncomingCall.localView.addView(videoController.getLocalView());

            binding.contentSinchIncomingCall.localView.requestLayout();
            binding.contentSinchIncomingCall.localView.invalidate();
            binding.contentSinchIncomingCall.remoteViewLayout.bringChildToFront(binding.contentSinchIncomingCall.localView);

        }
    }
});

Но после изменения позиций, remote_view перекрывается local_view.Я использую метод takeChildToFront для вывода local_view на передний план, но все еще не работает.Пожалуйста, помогите мне решить эту проблему.

Скриншоты: - First loaded views

After click

1 Ответ

0 голосов
/ 02 февраля 2019

Поскольку как удаленное, так и локальное видео являются поверхностями наложения, стандартный API-интерфейс для манипулирования иерархией представления, такой как bringChildToFront, работать не будет.Представьте, что оверлейный вид - это «вырезанное» прямоугольное отверстие во всех слоях над видеоизображением, что делает оверлей всегда «сверху».Очевидно, что возникнет конфликт, когда два накладываемых представления «всегда сверху» пересекаются.Эта проблема была решена в Sinch Android SDK 3.13.0 .Пожалуйста, используйте VideoController's setLocalVideoZOrder:

Устанавливает, будет ли локальное видео (предварительный просмотр с камеры) отображаться поверх удаленного просмотра видео (поведение по умолчанию) или наоборот, если представления перекрываются.* @param onTopOfRemoteView, если установлено значение false, удалит видео, отрисованное поверх предварительного просмотра.

void setLocalVideoZOrder(boolean onTopOfRemoteView);
...