关于近期遇到的坑-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

由于提供的参考引用中未涉及“QueuedBuffer - SurfaceView[com.neutroncode.mp/com.neutroncode.mp.NeutronMPCore]#10BLAST#10”的相关信息,下面从通用角度对其可能的含义进行分析。 “QueuedBuffer”通常指的是排队缓冲区,在图形渲染、视频播放等场景中,为了保证数据的流畅处理,会将待处理的数据放入缓冲区进行排队,这个缓冲区就可以称为“QueuedBuffer”。 “SurfaceView”是 Android 中用于实现高效图形绘制的视图,它可以在独立的线程中进行绘制,避免阻塞主线程,常用于视频播放、游戏等场景。“[com.neutroncode.mp/com.neutroncode.mp.NeutronMPCore]”可能是应用的包名和对应的核心组件名,表明这个“SurfaceView”是属于名为“com.neutroncode.mp”应用的“NeutronMPCore”组件。 “#10BLAST#10”可能是一个特定的标识符,“BLAST”可能是某种图形处理技术或者算法的缩写,两个“#10”可能分别代表不同的编号或者版本号,用于唯一标识这个特定的排队缓冲区和 SurfaceView 的组合。 ### 示例代码(模拟 SurfaceView 使用) ```java import android.content.Context; import android.graphics.Canvas; import android.view.SurfaceHolder; import android.view.SurfaceView; public class CustomSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder surfaceHolder; public CustomSurfaceView(Context context) { super(context); surfaceHolder = getHolder(); surfaceHolder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { Canvas canvas = holder.lockCanvas(); if (canvas != null) { // 进行绘制操作 holder.unlockCanvasAndPost(canvas); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 处理 Surface 变化 } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 处理 Surface 销毁 } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值