我有一个自定义视图,可以绘制 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在 VideoView 之上绘制? HUD extends SurfaceView
答案 0 :(得分:2)
我找到了您的问题的答案:VideoView on top of SurfaceView SurfaceView和VideoView都是表面视图,并且不支持在旧版本的Android中重叠这些视图,但是从2.0开始提供。
您需要做什么:
hudWidget.getHolder().setFormat(PixelFormat.TRANSPARENT);
hudWidget.setZOrderMediaOverlay(true);
有拉动请求,您可以尝试这些。 https://github.com/arthurbenemann/droidplanner/pull/247
带来解决方案的线程:https://groups.google.com/forum/?fromgroups#!msg/android-developers/nDNQcceRnYA/ps9wTBfXIyEJ
答案 1 :(得分:1)
来自FrameLayout
此处提供的文档:Link
子视图以堆栈形式绘制,包含最近添加的子视图 在顶部
将id
添加到布局文件中的FrameLayout
。在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);
答案 2 :(得分:1)
每隔50或100毫秒制作Handler
invalidate
hudView
@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;
}
答案 3 :(得分:0)
测试FrameLayout以替换RelativeLayout。
也许它运作良好。
答案 4 :(得分:0)
扩展VideoView
并在其构造函数中调用setWillNotDraw(false)
。这样,您就可以绘制onDraw(Canvas)
。