Android 重叠 VideoView 的布局排序无法正常工作

Android layout ordering for overlapping VideoViews not working correctly

我正在开发一个可以同时显示 2 个视频的应用程序。一个小的在右下角,另一个全屏(有点)。 当我在 Android 6.0.1 设备上 运行 video_view 时,订单正常工作。但是当我 运行 它在更新的版本上(例如 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();
    }

}

这可能就是您要找的。

<?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>

我在这方面的知识非常有限,但您的问题如下: 问题是因为像 VideoViewGLSurfaceView need/provide 这样的视图是一个专用的绘图区域并且被处理在绘制 UI 小部件的 "normal" 渲染管道之外。他们显示的图像在稍后阶段合成为最终图像。这个阶段不知道视图是如何布局的。

我认为这是 Android6 中的错误或未指定的行为,这些视图以何种顺序合成到最终图像上。

我能够重现您的问题并通过设置

解决了它
faceCameraView.setZOrderMediaOverlay(true);

在叠加层上 VideoView

有关详细信息,请查看 SurfaceView 的 class 描述,它是 VideoViewGLSurfaceView 的基础 class。