我试着在SurfaceView
的顶部显示VideoView
。但它不可见,但对点击有反应(MediaController出现,声音播放)。视频似乎SurfaceView
后面要播放,所以我也试图使setZOrderMediaOverlay()
和/或setZOrderOnTop()
使用,但什么都没有改变SurfaceView上的VideoView
当我去到主屏幕,我看到了VideoView在衰落动画第二分裂,所以它真的在那里。
我试着用xml布局,也完全编程,但没有任何作品。
这里是我的活动:
public class VideoTest extends Activity {
private RelativeLayout mLayout;
private VideoView mVideo;
private Handler mHandler;
private FrameLayout mFrameLayout;
private SurfaceView mSurfaceView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFrameLayout = new FrameLayout(this);
mFrameLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mLayout = new RelativeLayout(this);
mLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mVideo = new VideoView(this);
mVideo.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
mSurfaceView = new SurfaceView(this);
mSurfaceView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mSurfaceView.setZOrderMediaOverlay(false);
mSurfaceView.setZOrderOnTop(false);
mFrameLayout.addView(mSurfaceView);
mLayout.addView(mVideo);
mFrameLayout.addView(mLayout);
setContentView(mFrameLayout);
// with xml
// setContentView(R.layout.main);
// mFrameLayout = (FrameLayout) findViewById(R.id.activity_reader);
// mLayout = (RelativeLayout) findViewById(R.id.videoview);
// mVideo = (VideoView) findViewById(R.id.video_view);
// mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);
// Set the handler to me messaged from the threads
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg != null) {
mVideo.setMediaController(new MediaController(mVideo.getContext()));
mVideo.setVideoPath("/mnt/sdcard/myvideo.mp4");
if (mLayout.getVisibility() == View.VISIBLE) {
mLayout.setVisibility(View.GONE);
} else {
mLayout.setVisibility(View.VISIBLE);
}
// mFrameLayout.bringChildToFront(mLayout);
// mFrameLayout.bringChildToFront(mVideo);
// mFrameLayout.requestLayout();
// mFrameLayout.invalidate();
// mFrameLayout.postInvalidate();
// mVideo.requestFocus();
}
super.handleMessage(msg);
}
};
}
/** Inflate the menu */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_reader_menu, menu);
return true;
}
/** Handle menu items events */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.toggle_video:
new Thread() {
public void run() {
mHandler.sendEmptyMessage(0);
};
}.start();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
我的XML:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_reader"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<SurfaceView android:id="@+id/surface_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<RelativeLayout android:id="@+id/videoview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone">
<VideoView android:id="@+id/video_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</FrameLayout>
一个提示:由于这只是一个测试,找出为什么它不工作我试图尽量减少代码从我的真实应用程序中,VideoView
的可见性由处理程序控制,该处理程序从SurfaceView
的绘图线程获取消息。这就是为什么当我使用菜单时,我实现了一个线程发送消息。
但我在特殊情况下工作。在我的真实应用程序中,我可以用对话框主题调用另一个活动,并立即将VideoView放在顶部并保持在那里,即使我关闭顶部的活动。所以不知何故它的工作,但我无法控制它......感谢链接,反正! – WarrenFaith 2011-03-25 14:22:49
看起来我需要在SurfaceView上实现我自己的视频播放器...或者在API演示中找到它:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android /apis/media/MediaPlayerDemo_Video.html – WarrenFaith 2011-03-25 14:34:44
@WarrenFaith嘿,很久以前,但也许你会来:我认为它适用于当你显示视频时隐藏表面视图,反之亦然!?谢谢! – sjkm 2015-11-30 09:15:51