我正在使用Mono for Android。
我已经完成了有关使用VideoView的所有帖子,但无法找到答案。我已经转而使用带有MediaPlayer的SurfaceView,但又没有运气了。
我想在用户没有触摸屏幕一段时间后开始播放视频,所以我有一个FrameLayout来保存VideoView,当我想要显示视频时,我可以看到它。
当我启动视频时,它通常不显示(大约80%的时间),但音频开始播放。如果您触摸屏幕,则会显示视频。我尝试过不同的视频(.mp4和.3gp),但由于视频在您触摸屏幕后实际显示,我怀疑它是其他内容。
我在几台具有相同结果的设备上试过这个,虽然它们来自同一个制造商。它们都是Coby设备(一个7“和另一个9.7”)并且运行Android 4.0。我的目标是Android 2.3 API。
这是我的xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
... A bunch of controls ...
<FrameLayout
android:id="@+id/videoViewBack"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FF000000"
android:visibility="gone">
<VideoView android:id="@+id/videoView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:visibility="visible"/>
</FrameLayout>
</LinearLayout>
我启动视频的功能如下:
private void StartVideo()
{
RequestedOrientation = ScreenOrientation.SensorLandscape; // Force into landscape so the video looks good
FrameLayout vidBack = FindViewById<FrameLayout>(Resource.Id.videoViewBack);
vidBack.Visibility = ViewStates.Visible;
VideoView vid = FindViewById<VideoView>(Resource.Id.videoView);
vid.SetOnTouchListener(this);
vid.SetOnCompletionListener(this);
vid.SetVideoPath(_attractFile);
vid.SetMediaController(new MediaController(this));
vid.RequestFocus();
vid.Start();
}
我还尝试将Start()调用放在OnPreparedListener中,但这没有帮助。
我拔出我的头发,希望有人知道我忘了做什么蠢事。
修改
关于问题与布局传递中视频大小不正确的理论,我做了以下似乎已经纠正了问题。但我不是100%肯定为什么,或者它只是戳戳jello
在OnPrepared处理程序中,我添加了:
View mainScreen = FindViewById<View>(Resource.Id.MainScreen);
mainScreen.requestLayout();
mainScreen.postInvalidateDelayed(1000);
mainScreen.postInvalidate();
其中mainScreen是我的xml中的主要FrameLayout。在PostInvalidate中大部分时间都修复它,添加PostInvalidateDelayed会在100%的时间内修复它(我认为:))。
关于为什么会这样做的想法?
答案 0 :(得分:0)
@Override
public void surfaceCreated(final SurfaceHolder holder) {
mPlayer.setDisplay(holder); // 指定SurfaceHolder
gameActivity.handler.post(new Runnable() {
@Override
public void run() {
try {
mPlayer.prepare();
} catch (IllegalStateException e1) {
} catch (IOException e1) {
}
}
});
}
答案 1 :(得分:0)
试试这个:
videoView.setZOrderOnTop(true);