在Android VideoView上绘制覆盖图(HUD)?

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

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,因为它不在回购站中)。


  • 我找到了你的问题的答案:SurfaceView上的VideoView SurfaceView和VideoView都是曲面视图,它不支持在旧版本的Android中重叠这些,但自2.0版以来可用。

    你需要做什么:

  • 将像素格式设置为TRANSPARENT以便让视频通过界面闪耀
  • hudWidget.getHolder().setFormat(PixelFormat.TRANSPARENT);

  • 将HUD表面设置为媒体覆盖。
  • hudWidget.setZOrderMediaOverlay(true);

  • 创建一个新曲面并将其设置为播放视频的MediaPlayer的显示。
  • 有一个拉你的请求,你可以尝试这些。 https://github.com/arthurbenemann/droidplanner/pull/247

    提出解决方案的主题:https://groups.google.com/forum/?fromgroups#!msg/android-developers/nDNQcceRnYA/ps9wTBfXIyEJ


    从这里的FrameLayout文档:链接

    子视图以堆叠形式绘制,最近添加的子项位于顶部

    在布局文件的FrameLayout中添加一个id 。 在你的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);
    

    做一个Handlerinvalidate你的hudView每50或100毫秒invalidate

    喜欢这个:

    @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;
        }
    
    链接地址: http://www.djcxy.com/p/73133.html

    上一篇: Draw overlay (HUD) on Android VideoView?

    下一篇: Timestamps in upstart logs