关于近期遇到的坑-SurfaceView,RecylerView等

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

近期参与了一个多人视频通话的业务,在其中使用SurfaceView负责显示用户的视频流,没想到被坑死。。

关于显示和隐藏

背景: 由于是用六宫格的形式同时展示多人的视频,就选用了RecyclerView来实现,视频用SurfaceView展示,如果用户关掉了摄像头,使用语音模式就不显示SurfaceView,只显示用户头像就可以了。 因为之前仅仅用过SurfaceView当做显示摄像头数据,没有深入研究过,这次栽倒坑里了。

实现的方式是如果是视频模式就add一个surfaceView到一个FrameLayout(如果FrameLayout里面没有的话),如果用户切换到语音模式,就把那个FrameLayout设为GONE,显示头像。
流程看起来一点毛病没有,当收到用户切换模式的回调时,刷新该用户的item。问题来了,用户从视频模式->语音模式切换后,那个SurfaceView还依然显示,诡异的是再次刷新一下就切换了,但是已经差了一步,已经是错误的状态了,还有更诡异的是如果是当前用户点击按钮来切换自己的模式时却会立即改变,一点毛病没有。并且执行notifyDataSetChanged也是正常的。。如果每个用户的添加减少都全量刷新的话,肯定会黑一下,添加退出的动画也废了,这肯定没法接受。

一开始我是认为没有这个View没有失去焦点的原因,用的ViewStub,干掉,不行,用的自定义控件包装的整个多人视频的控件和逻辑,拆开还是不行,问题也不在这儿,因为是加在聊天界面的上面,怀疑是不是聊天的内容或者输入框抢占了焦点,测试了下别的控件,也没有出现这种情况。我想静静了。。

后来偶然发现stackoverflow一个问题(链接),说的是将SurfaceView的父控件setVisibility(GONE),并不能把SurfaceView隐藏,,,SurfaceView单独在一个Window

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值