在我的活动中,我有2个VideoViews。我必须一个接一个地连续播放不同的视频文件。
为了减少切换时间,我计划翻转视频视图。即一个视频视图为VISIBLE
,而另一个视频视图为GONE
。在播放可见视频视图时,我可以初始化(setVideoPath
)其他视频视图。
但是基于Logs,我发现对于具有可见性GONE
的视频视图,在调用setVideoPath
之后,只有在视图变为{{OnPreparedListener
时才会调用VISIBLE
1}}。即在第一个视频观看完成后,我切换可见性,然后我得到第二个视频观看的OnPreparedListener
。
为了确认我的发现,我制作了视频观VISIBLE
并致电setVideoPath
。在这种情况下,立即调用OnPreparedListener
。
问题:
VideoView准备(setVideoPath
)是否取决于其可见性?
有没有办法在后台准备视频(不向用户显示)?
谢谢!
答案 0 :(得分:1)
VideoView准备(setVideoPath)是否依赖于其可见性?
显然是的。 openVideo()要求有一些可见性
public void setVideoURI(Uri uri) {
mUri = uri;
mStartWhenPrepared = false;
mSeekWhenPrepared = 0;
openVideo();
requestLayout();
invalidate();
}
有没有办法在后台准备视频(不向用户显示)?
扩展此VideoView
并自行处理。或者只使用您自己的VideoView
答案 1 :(得分:0)
通过浏览VideoView和SurfaceView的源代码,看起来大多数初始化Media Player的工作直到视图可见后才会发生。我没有看到解决方法。
特别是,这是SurfaceView.java在视图变为可见时运行的部分:
if (visible) {
// other stuff
if (visibleChanged) {
mIsCreating = true;
for (SurfaceHolder.Callback c : callbacks) {
c.surfaceCreated(mSurfaceHolder);
}
}
// other stuff
}
在VideoView.java中调用它:
SurfaceHolder.Callback mSHCallback = new SurfaceHolder.Callback()
{
// other stuff
public void surfaceCreated(SurfaceHolder holder)
{
mSurfaceHolder = holder;
openVideo();
}
// other stuff
}
openVideo()就是所有魔法发生的地方。
答案 2 :(得分:0)
在将视图绑定到相机应用程序之前,必须显示视图并进行布局。 (在您做任何事情之前,应处理表面视图回溯)。