【问题标题】:VideoView doesn't start when invisibleVideoView 不可见时不启动
【发布时间】:2011-11-28 04:08:13
【问题描述】:

我有一个 AsyncTask,我在其中隐藏一个视频视图,开始视频播放,并在视频播放时显示视频视图。

但是当视频视图设置为不可见时,视频将无法启动,异步任务一直挂在 onBackground 中。如果我注释掉这一行,视频就会开始播放。 为什么视频视图需要可见表面?

public void walk(final View v) {

    new AsyncTask() {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mVideoView.setVisibility(View.INVISIBLE); // this line causes video not to start
            mVideoView.start();
        }

        @Override
        protected Object doInBackground(Object... objects) {
            while (!mVideoView.isPlaying()) {}
            return null;
        }

        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            mVideoView.setVisibility(View.VISIBLE);
        }

    }.execute();

我这样做的一些背景知识:我尽量避免在开始播放视频时常见的黑色闪光问题:

https://stackoverflow.com/search?q=%5Bandroid%5D+videoview+black

https://stackoverflow.com/search?q=%5Bandroid%5D+video+%5Bmediaplayer%5D+black

【问题讨论】:

    标签: android android-asynctask android-videoview android-mediaplayer


    【解决方案1】:

    VideoView 确实是一个专门的SurfaceView。 SurfaceView 的工作原理是在普通窗口(包含所有视图)后面创建另一个窗口,然后有一个透明区域,以便可以在其后面看到新窗口(具有自己的绘图表面)。

    如果 SurfaceView 不再可见,则其表面将被销毁,即调用SurfaceHolder.Callback.surfaceDestroyed。如果没有有效的表面,VideoView 将不会尝试播放其视频,因此您的AsyncTask 将永远无法离开doInBackground

    Surface 会在 SurfaceView 的窗口可见时为您创建;您应该实现surfaceCreated(SurfaceHolder) 和surfaceDestroyed(SurfaceHolder) 来发现Surface 的创建和销毁时间,因为窗口显示和隐藏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-15
      • 2015-10-09
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      相关资源
      最近更新 更多