Порядок раскладки Android для перекрывающихся VideoViews работает неправильно - PullRequest
0 голосов
/ 02 ноября 2018

Я разрабатываю приложение, которое будет показывать 2 видео одновременно. Один маленький в правом нижнем углу, а другой полный экран (вроде). Когда я запускаю video_view на устройстве Android 6.0.1, порядок работает правильно. Но когда я запускаю его на более новой версии (например, Android 7), он не упорядочивается правильно. Также функция setZ () ничего не делает для меня.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <nl.hacker115.drivingwithdrivepro550.CustomVideoView
        android:id="@+id/roadCamera"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <nl.hacker115.drivingwithdrivepro550.CustomVideoView
        android:id="@+id/faceCamera"
        android:layout_width="500dp"
        android:layout_height="300dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="16dp"
        android:layout_gravity="bottom|end" />
</FrameLayout>

Я хочу, чтобы faceCamera был на вершине roadCamera, как я могу это сделать?

Мой CustomVideoView.java выглядит так

package nl.hacker115.drivingwithdrivepro550;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.VideoView;

public class CustomVideoView extends VideoView {
    private PlayPauseListener mListener;

    public CustomVideoView(Context context) {
        super(context);
    }

    public CustomVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomVideoView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setPlayPauseListener(PlayPauseListener listener) {
        mListener = listener;
    }

    @Override
    public void pause() {
        super.pause();
        if (mListener != null) {
            mListener.onPause();
        }
    }

    @Override
    public void start() {
        super.start();
        if (mListener != null) {
            mListener.onPlay();
        }
    }

    public static interface PlayPauseListener {
        void onPlay();
        void onPause();
    }

}

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Мои знания в этой области очень ограничены, но ваша проблема заключается в следующем: Проблема в том, что представления, такие как VideoView и GLSurfaceView, нуждаются / предоставляют выделенную область рисования и обрабатываются вне "обычного" конвейера рендеринга. который рисует виджеты пользовательского интерфейса. Изображение, которое они показывают, составляется в окончательное изображение на более позднем этапе. На этом этапе не известно, как выглядит представление.

Я предполагаю, что это было ошибкой или неуказанным поведением в Android 6, в каком порядке эти представления объединяются в окончательное изображение.

Я смог воспроизвести вашу проблему и решил ее, установив

faceCameraView.setZOrderMediaOverlay(true);

на оверлее VideoView.

Для получения дополнительной информации взгляните на описание класса SurfaceView , который является базовым классом для VideoView и GLSurfaceView.

0 голосов
/ 03 ноября 2018

Это может быть то, что вы ищете.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<nl.hacker115.drivingwithdrivepro550.CustomVideoView
    android:id="@+id/roadCamera"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<nl.hacker115.drivingwithdrivepro550.CustomVideoView
    android:id="@+id/faceCamera"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginEnd="16dp"
    android:layout_marginBottom="16dp"
    android:layout_gravity="bottom|end"
    android:layout_marginRight="16dp" />
</FrameLayout>
...