7

我有一个绘制HUD的自定义视图:

平视显示器

这是我的布局:

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

    <VideoView
        android:id="@+id/videoView1"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <com.widgets.HUD
            android:id="@+id/hud"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

</FrameLayout>
public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.hud_fragment, container, false);

    frameLayout = (FrameLayout) view.findViewById(R.id.frameLayout);

    hudWidget = (HUD) view.findViewById(R.id.hudWidget);

    videoView = (VideoView) view.findViewById(R.id.videoView1);
    videoView.setVideoURI(Uri.parse("http://88.150.210.138:5001/spor"));
    videoView.start();

    frameLayout.removeView(hudWidget);
    frameLayout.addView(hudWidget);
    hudWidget.bringToFront();

    return view;
}

一旦视频开始播放,我就会在我的VideoView上播放RTSP流,它看起来像这样:

HUD 上的视频

如何强制 HUD 在VideoView上绘制?HUD extends SurfaceView

项目

  • 我正在尝试添加 VideoView 的项目是DroidPlanner您可以尝试克隆并查看问题。(需要手动添加 VideoView,因为它不在 repo 中)。

4

5 回答 5

3

我找到了您问题的答案:SurfaceView 之上的VideoView SurfaceView 和 VideoView 都是表面视图,不支持在旧版本的 Android 中重叠这些视图,但自 2.0 起可用。

你需要做什么:

  1. 将 pixelformat 设置为 TRANSPARENT 以让视频通过界面闪耀

hudWidget.getHolder().setFormat(PixelFormat.TRANSPARENT);

  1. 将 HUD 表面设置为媒体叠加。

hudWidget.setZOrderMediaOverlay(true);

  1. 创建一个新表面并将其设置为播放视频的 MediaPlayer 的 Display。

有一个拉取请求,您可以在其中尝试这些。https://github.com/arthurbenemann/droidplanner/pull/247

带来解决方案的线程:https ://groups.google.com/forum/?fromgroups#!msg/android-developers/nDNQcceRnYA/ps9wTBfXIyEJ

于 2013-08-17T21:57:51.953 回答
1

FrameLayout此处可用的文档中:链接

子视图在堆栈中绘制,最近添加的子视图在顶部

idFrameLayout布局文件中添加一个。在您的onCreate(Bundle)中,您将有类似的内容:

// find your framelayout
frameLayout = (FrameLayout) findViewById(....);

videoView = (VideoView) findViewById(R.id.videoView1);

hudView = (com.widgets.HUD) findViewById(R.id.hud);

视频开始后,请执行以下操作:

frameLayout.removeView(hudView);

frameLayout.addView(hudView);
于 2013-08-12T11:20:21.390 回答
1

每 50 或 100毫秒做Handler一个invalidatehudView

像这样:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.hud_fragment, container, false);

        frameLayout = (FrameLayout) view.findViewById(R.id.frameLayout);

        hudWidget = (HUD) view.findViewById(R.id.hudWidget);

        videoView = (VideoView) view.findViewById(R.id.videoView1);
        videoView.setVideoURI(Uri.parse("http://88.150.210.138:5001/spor"));
        videoView.start();

        frameLayout.removeView(hudWidget);
        frameLayout.addView(hudWidget);
        hudWidget.bringToFront();

        //The Handler which invalidate your (hudWidget) every 50 milliseconds 

        new Handler() {
            public void handleMessage(android.os.Message msg) {
                super.handleMessage(msg);
                hudWidget.invalidate();
                sendEmptyMessageDelayed(0, 50);

            };
        }.sendEmptyMessage(0);

        return view;
    }
于 2013-08-14T01:26:33.310 回答
0

测试 FrameLayout 以替换 RelativeLayout。

也许它运作良好。

于 2013-08-16T00:46:03.067 回答
0

在其构造函数中扩展VideoView和调用。setWillNotDraw(false)这样你就可以画进去了onDraw(Canvas)

于 2019-04-16T08:21:00.477 回答