【问题标题】:VideoView flickering issueVideoView闪烁问题
【发布时间】:2013-07-11 07:28:49
【问题描述】:

我在使用 VideoView 时遇到了奇怪的闪烁问题。当活动开始时,它会导致一小部分的轻微闪烁一秒钟。然后,视频开始。它在视频的顶部和底部显示 2 条黑线。请参阅下面的快照。

我已经在 2 台设备上测试了我的应用程序

1) 三星 n-8000(平板电脑)

2) 联想 a-800

video.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:background="#ffffff"
 android:gravity="center">

 <VideoView 
    android:id="@+id/vvSplash"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="#00ffffff">
</VideoView>

</LinearLayout>

活动代码:

private VideoView vd;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.video);
    vd = (VideoView) findViewById(R.id.vvSplash);
    playVideo();
}

private void playVideo() {
    Uri uri = Uri.parse("android.resource://" + getPackageName() +"/"+ R.raw.intro);
    vd.setVideoURI(uri);
    vd.setMediaController(null);
    vd.start();     
}

任何帮助将不胜感激。谢谢你。

【问题讨论】:

  • @Piotr Chojnacki 感谢编辑问题..:)
  • 我也遇到了和你一样的问题。你是如何解决这个问题的?

标签: android android-videoview


【解决方案1】:

听起来很荒谬,但答案就在这里:

我重复解决方案,向发现的人致敬:

<SurfaceView
    android:layout_width="0px"
    android:layout_height="0px"
    android:visibility="gone" />

非常重要将表面视图添加到活动中的根视图,而不是直接父视图。否则将无法正常工作。

【讨论】:

【解决方案2】:

我也遇到了同样的问题,但通过将 videoview 的布局参数从 wrap content 更改为 match parent 来解决它。您还需要从 XML 中删除视频视图的背景属性。希望对你有用

【讨论】:

  • 我已经测试了你所说的但没有工作。无论如何,谢谢,我 +1。
  • 我正在播放一个视频,完成后我在视频上放了一个缩略图,但是当视频开始和结束时,我得到了这些黑色闪烁,在阅读了这篇文章后,我尝试设置视频的背景到缩略图,和 POOF,没有更多的问题。谢谢,+1。
【解决方案3】:

对于未来的人们: 这个丑陋的 bug 似乎已经在 Marshmallow 中解决了。在我的工作中,我们正在使用 Xamarin 进行开发(因此,基本上,所有视图都是以编程方式添加的)。我们有一堆测试设备,我主要使用 Marshmallow 设备,所以在构建我正在处理的页面时,我从未注意到这种黑色闪烁。最后用棒棒糖设备测试后,我注意到了这个闪烁。

很遗憾,我没有解决方案。我们需要我们的应用程序尽可能跨平台,因此不鼓励使用布局 xml /sadface。

【讨论】:

【解决方案4】:

如果您的问题是VideoView 按下后退按钮时闪烁,只需在之前的活动的onBackPressed() 方法中将VideoView 可见性设置为INVISIBLEGONE调用超级实现。

如果用户也可以通过“向上”按钮离开,拦截android.R.home选项项以隐藏VideoView

这是 Kotlin 中的一个示例:

override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
    android.R.id.home -> super.onOptionsItemSelected(item).also {
        video_view.visibility = GONE // Hide videoView before leaving to avoid flickering
    }
    R.id.action_share -> consume { shareVideo() } // Your regular menu options
    else -> super.onOptionsItemSelected(item)
}

override fun onBackPressed() {
    video_view.visibility = GONE // Hide videoView before leaving to avoid flickering
    super.onBackPressed()
}

【讨论】:

    【解决方案5】:

    只需从您的 xml 中删除以下行。

    android:background="#00ffffff"
    

    它会帮助你:)

    【讨论】:

      【解决方案6】:

      对于仍然面临问题并且不知道如何使用上述答案的任何人。 它只是简单地复制此代码并将其粘贴到您使用 videoview 在主(第一个)布局下的主活动布局中。

      <SurfaceView
          android:layout_width="0px"
          android:layout_height="0px"
          android:visibility="gone" />
      

      就我而言

      <?xml version="1.0" encoding="utf-8"?>
      <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/Mainframlayout"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:background="@color/facebookbgcolor" >
      <SurfaceView
          android:layout_width="0px"
          android:layout_height="0px"
          android:visibility="gone" />
      .....rest of the layout
      

      【讨论】:

        【解决方案7】:

        改编自 https://stackoverflow.com/a/27307286/38557 的基于 xml 的解决方案,改为使用 Java 代码。将它放在 Fragment 的 onCreateView() 中,然后再膨胀布局:

        // Add a SurfaceView to prevent flickering when the video is loaded later.
        SurfaceView surfaceView = new SurfaceView(getActivity());
        surfaceView.setVisibility(View.GONE);
        container.addView(surfaceView, new ViewGroup.LayoutParams(0, 0));
        

        它做同样的事情,并且可以在您不能或不想更改 XML 时使用。

        【讨论】:

          猜你喜欢
          • 2015-01-04
          • 2016-03-06
          • 2012-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-27
          • 2018-08-04
          • 2017-02-01
          相关资源
          最近更新 更多