重叠VideoView的Android布局顺序无法正常运行

时间:2018-11-02 14:12:42

标签: android android-videoview

我正在开发一个可同时显示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();
    }

}

2 个答案:

答案 0 :(得分:2)

这可能就是您想要的。

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

答案 1 :(得分:0)

我在这方面的知识非常有限,但是您遇到的问题如下:问题是因为VideoViewGLSurfaceView之类的视图需要/提供一个专用的绘图区域,并且不在“常规”的渲染管道,用于绘制UI小部件。他们显示的图像在稍后阶段被合成为最终图像。这个阶段尚不知道以哪种方式对视图进行布局。

我认为这是Android 6中的错误或未指定的行为,这些视图以什么顺序组合到最终图像上。

我能够重现您的问题并通过设置解决了该问题

faceCameraView.setZOrderMediaOverlay(true);

覆盖VideoView上。

有关更多信息,请查看SurfaceView的类描述,它是VideoViewGLSurfaceView的基类。