近期参与了一个多人视频通话的业务,在其中使用SurfaceView负责显示用户的视频流,没想到被坑死。。
关于显示和隐藏
背景: 由于是用六宫格的形式同时展示多人的视频,就选用了RecyclerView来实现,视频用SurfaceView展示,如果用户关掉了摄像头,使用语音模式就不显示SurfaceView,只显示用户头像就可以了。 因为之前仅仅用过SurfaceView当做显示摄像头数据,没有深入研究过,这次栽倒坑里了。
实现的方式是如果是视频模式就add一个surfaceView到一个FrameLayout(如果FrameLayout里面没有的话),如果用户切换到语音模式,就把那个FrameLayout设为GONE,显示头像。
流程看起来一点毛病没有,当收到用户切换模式的回调时,刷新该用户的item。问题来了,用户从视频模式->语音模式切换后,那个SurfaceView还依然显示,诡异的是再次刷新一下就切换了,但是已经差了一步,已经是错误的状态了,还有更诡异的是如果是当前用户点击按钮来切换自己的模式时却会立即改变,一点毛病没有。并且执行notifyDataSetChanged也是正常的。。如果每个用户的添加减少都全量刷新的话,肯定会黑一下,添加退出的动画也废了,这肯定没法接受。
一开始我是认为没有这个View没有失去焦点的原因,用的ViewStub,干掉,不行,用的自定义控件包装的整个多人视频的控件和逻辑,拆开还是不行,问题也不在这儿,因为是加在聊天界面的上面,怀疑是不是聊天的内容或者输入框抢占了焦点,测试了下别的控件,也没有出现这种情况。我想静静了。。
后来偶然发现stackoverflow一个问题(链接),说的是将SurfaceView的父控件setVisibility(GONE),并不能把SurfaceView隐藏,,,SurfaceView单独在一个Window

本文记录了使用SurfaceView配合RecyclerView实现实时视频显示时遇到的问题及解决方案,包括SurfaceView显示控制、RecyclerView数据源管理和局部刷新等。
最低0.47元/天 解锁文章
678

被折叠的 条评论
为什么被折叠?



