VideoView闪烁的问题

我正在使用VideoView面临奇怪的闪烁问题。 当活动开始时,它会导致一秒钟的小部分闪烁。 然后,video开始。 它在video的顶部和底部显示2条黑线。 看下面的快照。

检查快照

我在两台设备上testing了我的应用程序

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(); } 

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

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

  • VideoView里面的片段导致黑屏拂动
  • SurfaceView在加载时闪烁黑色

我重复这个解决scheme,对那些发现的人表示赞赏:

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

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

我也面临同样的问题,但解决了它通过从wrap内容更改videoview的布局参数匹配父。 你也需要从XML中删除video视图的背景属性。 我希望它会为你工作

对于未来的人们来说:这个丑陋的bug似乎已经在棉花糖中得到了解决。 在我的工作中,我们正在用Xamarin进行开发(所以基本上所有的视图都是以编程方式添加的)。 我们有很多testing设备,而且我主要使用棉花糖设备,所以在构build我正在编写的页面时,我从来没有注意到这种黑色闪烁。 最后用棒棒糖设备testing之后,我注意到了这个闪烁。

不幸的是我没有解决scheme。 我们需要我们的应用程序尽可能跨平台,所以使用布局xml是不鼓励/悲伤的。

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

如果用户还可以通过“向上”button离开,则截取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() } 

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

 android:background="#00ffffff" 

它会帮助你:)

对于任何仍然面临问题的人,并没有得到如何使用上述答案。 它只是复制这段代码,并将其粘贴到主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 

https://stackoverflow.com/a/27307286/38557改编基于xml的解决scheme来代替使用Java代码&#x3002; 把它放在碎片的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时使用。