片段内的VideoView导致黑屏闪烁
Posted
技术标签:
【中文标题】片段内的VideoView导致黑屏闪烁【英文标题】:VideoView inside fragment causes black screen flicking 【发布时间】:2013-07-17 01:48:48 【问题描述】:我们有一个在 android API 4.0 上运行的 Android 应用程序。其中一个活动的布局将屏幕分为两部分。在左侧,我们有一个带有一些按钮的静态部分。在右侧,我们有一个 FrameLayout,它将根据按下的按钮切换到相应的片段。
问题: 右侧的片段之一包含一个 VideoView。当用户点击按钮来显示这个片段时,片段就会显示出来,并且视频会立即开始播放:在渲染这个片段时,整个屏幕会以黑色闪烁,这非常烦人。
下面是 VideoFragment 类的一些代码:
public class VideoFragment extends Fragment
public VideoView videoView;
private ExternalVideo mVideo;
private boolean mVideoExists;
private String mDestination;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
mDestination = ApplicationParams.MEDIA_STORAGE_PATH + "videos/"
+ FilenameUtils.getBaseName(((DetailActivity)getActivity()).getProduct().getVideoUrl())
+ "."
+ FilenameUtils.getExtension(((DetailActivity) getActivity()).getProduct().getVideoUrl());
File file = new File(mDestination);
mVideoExists = file.exists() && file.isFile();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View view;
if (mVideoExists)
getActivity().getWindow().setFormat(PixelFormat.TRANSLUCENT);
view = inflater.inflate(R.layout.video, null);
mVideo = new ExternalVideo(mDestination);
videoView = (VideoView) view.findViewById(R.id.video_video);
MediaController mediaController = new MediaController(getActivity());
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);
videoView.setVideoPath(mVideo.getFullPath());
videoView.requestFocus();
videoView.setVisibility(View.VISIBLE);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener()
public void onPrepared(MediaPlayer mp)
videoView.start();
);
else
TextView textView = new TextView(getActivity());
textView.setText(getActivity().getString(R.string.videofragment_video_coming_soon));
textView.setPadding(50, 50, 50, 50);
view = textView;
return view;
这是视频片段的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_>
<VideoView android:id="@+id/video_video"
android:layout_
android:layout_alignParentRight="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_/>
</RelativeLayout>
有没有人知道在渲染包含 VideoView 的片段时可能导致此闪烁问题的原因是什么?解决方案将不胜感激!
EDIT1:如果我单击屏幕上 VideoView 所在的片段,开始时会闪烁。然后当我导航到另一个片段并返回到包含 VideoView 的片段时,闪烁消失了。
【问题讨论】:
您是否在模拟器中运行了您的应用程序? 在三星 Galaxy Tab 2 10.1 平板电脑上运行应用程序 在您的MediaController
上尝试setAnchorView(videoView)
developer.android.com/reference/android/widget/…
@KenWolf 试过了,弹跳依然存在。
该代码现在完美运行。 ***.com/questions/17697670/…
【参考方案1】:
我可以通过在片段的父 Activity 的布局中添加一个 0px x 0px SurfaceView 来解决这个问题:
<SurfaceView
android:layout_
android:layout_ />
【讨论】:
我也面临同样的问题,当我启动视频片段时,它首先显示 BG(壁纸屏幕)n 然后显示视频片段。我尝试使用 onPreparedListener(..) 但结果相同...有什么想法/建议吗? 也为我工作。也适用于活动类 ***.com/questions/8772862/… @Med AL 在 XML 布局中 是的,我知道,但具体在哪里?在 VideoView 标签之前? @KennyDs【参考方案2】:KennyDs 是对的,但最好确保隐藏 SurfaceView,否则如果您为片段设置动画,您将有非常奇怪的行为,那么您将在动画片段的位置看到黑屏。幸运的是,这个附带问题也很容易解决:
<SurfaceView
android:layout_
android:layout_
android:visibility="gone" />
【讨论】:
在 Android 5.1 上没有区别。【参考方案3】:如果你想知道为什么添加一个大小为零的 SurfaceView 可以解决问题,你可以看看这个问题SurfaceView flashes black on load。它解释得很好。
引自 Evos 的回答
当表面视图第一次出现在窗口中时,它通过调用私有 IWindowSession.relayout(..) 方法请求更改窗口的参数。这种方法“给”你一个新的框架、窗口和窗口表面。我认为屏幕在那一刻闪烁。解决方案非常简单:如果您的窗口已经有适当的参数,它将不会刷新所有窗口的内容并且屏幕不会闪烁。最简单的解决方案是在活动的第一个布局中添加一个 0px 高度的普通 SurfaceView。这将在活动显示在屏幕上之前重新创建窗口,当您设置第二个布局时,它将继续使用具有当前参数的窗口。
这里有一个更简洁的方法来解决这个问题,在调用 setContentView() 之前调用它,刚刚在我的 ViewPager 上测试了一些包含 VideoView 的 Fragments,它与添加零大小的 SurfaceView 一样好:
getWindow().setFormat(PixelFormat.TRANSLUCENT);
【讨论】:
这一行代码解决了这个问题。谢谢 这对我在 Android 5.1 上没有任何影响。【参考方案4】:只需添加VideoView
的透明背景色即可。它将解决问题。
android:background="@color/transparent"
【讨论】:
以上是关于片段内的VideoView导致黑屏闪烁的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 的 Firebase URL 的 VideoView 中显示视频