2

我正在为 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% 的时间(我认为 :) )。

关于为什么这有效的想法?

4

2 回答 2

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) {
            }
        }
    });
}
于 2012-10-26T03:53:44.167 回答
0

尝试这个:

videoView.setZOrderOnTop(true);
于 2018-02-09T14:44:15.577 回答