我正在为 Android 使用 Mono。
我翻遍了所有我能找到的关于 VideoView 使用的帖子,但找不到答案。我已经切换到使用带有 MediaPlayer 的 SurfaceView 并再次返回,但没有运气。
我希望在用户有一段时间没有触摸屏幕后开始播放视频,所以我有一个保存 VideoView 的 FrameLayout,当我希望视频显示时,我让它可见。
当我开始播放视频时,它通常不显示(大约 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% 确定为什么,或者它只是在戳果冻
在 OnPrepared 处理程序中,我添加了:
View mainScreen = FindViewById<View>(Resource.Id.MainScreen);
mainScreen.requestLayout();
mainScreen.postInvalidateDelayed(1000);
mainScreen.postInvalidate();
其中 mainScreen 是我的 xml 中的主要 FrameLayout。大部分时间做 PostInvalidate 修复它,添加 PostInvalidateDelayed 修复它 100% 的时间(我认为 :) )。
关于为什么这有效的想法?