逻辑描述
当A视频正在播放中,点击A视频跳过A视频剩余内容并加载B视频
Bug描述
在切换视频时,显示短暂黑屏,如下图所示:
解决思路
当看到这个bug出现时,第一反应是第二段视频在初始化视频时有一定的延时,导致黑屏的出现,那么我们只要想办法填补上这段延时就可以了。
具体解决方案
首先将B视频的第一帧图片获取到
用FrameLayout作为父布局,将帧图盖到最上面一层(也就是VideoView上面)
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<xyz.doikki.videoplayer.player.VideoView
android:id="@+id/player"
android:layout_width="match_parent"
android:layout_height="match_parent">
</xyz.doikki.videoplayer.player.VideoView>
<ImageView
android:id="@+id/img_sleep"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/sleep"
/>
</FrameLayout>
然后监听videoview的点击事件,点击时加载B视频,并且将imageview的visibility改为可见
player.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//A视频点击,加载B视频
currentStatus = 1;
AssetFileDescriptor fd = getResources().openRawResourceFd(R.raw.home);
player.setLooping(false);
player.setAssetFileDescriptor(fd);
player.replay(false);
img_sleep.setVisibility(VISIBLE);
}
});
之后在videoView的播放状态监听方法里调用
player.setOnStateChangeListener(new BaseVideoView.OnStateChangeListener() {
@Override
public void onPlayerStateChanged(int playerState) {
Log.e("SleepActivity", "onPlayerStateChanged: " + playerState);
}
@Override
public void onPlayStateChanged(int playState) {
Log.e("SleepActivity", "onPlayStateChanged: " + playState);
if (currentStatus == 1 && playState == 3) {
handler.postDelayed(new Runnable() { // 开启的runnable也会在这个handler所依附线程中运行,即主线程
@Override
public void run() {
// 可更新UI或做其他事情
// 注意这里还在当前线程,没有开启新的线程
// new Runnable(){},只是把Runnable对象以Message形式post到UI线程里的Looper中执行,并没有新开线程。
img_sleep.setVisibility(View.GONE);
}
}, 80); // 延时80MS执行run内代码
}
}
});
注意上面代码,当B视频开始播放时,不能让帧图过早的消失,否则可能还会出现黑屏效果,所以我在这里加了80MS的延时(这里根据硬件去改为合适的值)
最终效果
可以清楚地看到,已经没有肉眼可见的黑屏现象了。
好了这篇随意的分享就到这里。下一期,我将分享一些大厂关于Android、JAVA的面试总结以及知识导图,有兴趣的小伙伴一定要关注我!
***欢迎各位同学关注,接下来我会经常更新分享java 、小程序、Android、大前端、全栈方面的知识或是源码,坚持分享共同进步。