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>
我在这方面的知识非常有限,但您的问题如下: 问题是因为像 VideoView
和 GLSurfaceView
need/provide 这样的视图是一个专用的绘图区域并且被处理在绘制 UI 小部件的 "normal" 渲染管道之外。他们显示的图像在稍后阶段合成为最终图像。这个阶段不知道视图是如何布局的。
我认为这是 Android6 中的错误或未指定的行为,这些视图以何种顺序合成到最终图像上。
我能够重现您的问题并通过设置
解决了它
faceCameraView.setZOrderMediaOverlay(true);
在叠加层上 VideoView
。
有关详细信息,请查看 SurfaceView 的 class 描述,它是 VideoView
和 GLSurfaceView
的基础 class。
我正在开发一个可以同时显示 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>
我在这方面的知识非常有限,但您的问题如下: 问题是因为像 VideoView
和 GLSurfaceView
need/provide 这样的视图是一个专用的绘图区域并且被处理在绘制 UI 小部件的 "normal" 渲染管道之外。他们显示的图像在稍后阶段合成为最终图像。这个阶段不知道视图是如何布局的。
我认为这是 Android6 中的错误或未指定的行为,这些视图以何种顺序合成到最终图像上。
我能够重现您的问题并通过设置
解决了它faceCameraView.setZOrderMediaOverlay(true);
在叠加层上 VideoView
。
有关详细信息,请查看 SurfaceView 的 class 描述,它是 VideoView
和 GLSurfaceView
的基础 class。