textureview基础教程


textureview基础教程
文章图片

文章图片
两种显示方式:
1.主播全屏 , 其他游客悬浮在右侧 。下面简称大小屏模式 。
textureview基础教程
文章图片

文章图片
2.所有人等分屏幕 。下面简称等分模式 。
textureview基础教程
文章图片

文章图片
最多4人连麦 , 明确这点方便定制坐标算法 。自定义的ViewGroup最好分别提供等分模式和大小屏模式的边距设置接口 , 便于修改 。SDK自己管理了TextureView的绘制和测量 , 所以ViewGroup需要复写onMeasure方法以通知TextureView测量和绘制 。一个计算0.0f~1.0f逐渐减速的函数 , 给动画过程做支撑 。一个记录坐标的数据模型 。和一个根据现有ChildView的数量计算两种布局模式下 , 每个View摆放位置的函数 。
1.定义坐标数据模型
以上 , 记录了执行动画和销毁View所需的数据 。(于源码中第352行)
2.计算不同展示模式下View坐标的函数
Demo源码中的add、remove、toggle方法重复代码过多 , 未来得及优化 。这里只附上addVideoView中的计算部分(于源代码中第141行) , 只需稍微修改即可适用add、remove和toggle 。(也可参考CDNLiveVM中的calcPosition方法 , 为经过优化的版本)layoutTopicMode=true时 , 为大小屏模式 。
由于是定制算法 , 只能适用这一种布局 , 故不写注释 。只需明确一点 , 此方法最终目的是为了计算出每个View当前应该出现的位置 , 保存到上面定义的数据模型中并开启动画(最后一行postAnimThread为开启动画的代码 , 我这里是通过post一个线程来更新每一帧) 。
可根据不同的需求写不同的实现 , 最终符合定义的数据模型即可 。
3.逐渐减速的算法 , 使动画效果看起来更自然 。
上述代码除了提供减速算法 , 还一并更新了对应View数据模型的中间值 , 也就是模型定义种的left,top,right,bottom 。
通过减速算法提供的进度值 , 乘以目标坐标与起始坐标的间距 , 得出中间值 。
逐渐减速的算法关键代码为:
这个算法实现的有缺陷 , 因为它直接修改了进度时间 , 大概率会导致执行完毕的时间与设置的预期时间(如设置200ms执行完毕 , 实际可能超过200ms)不符 。文末我会提供一个优化的减速算法 。
变量waitingTime表示等待多久执行下一帧动画 。用每秒1000ms计算即可 , 如果目标为60刷新率的动画 , 设置为1000/60=16.66667即可(近似值) 。
计算并存储每个View的中间值后 , 调用requestLayout()通知系统的onMeasure和onLayout方法 , 重新摆放View 。
4.定义边距相关的变量 , 供简单的定制修改
【textureview基础教程】取名时对这三个变量的职责定义 , 与编写逻辑时的定义有出入 , 所以有点词不达意 , 需参考注释 。
由于这只是定制化的变量 , 并不重要 , 可根据业务逻辑自行随意修改 。
5.复写onMeasure方法 , 这里主要是通知TextureView更新大小 。
1.明确数据模型 , 一般情况下记录起始上下左右坐标、目标上下左右坐标、和进度百分比就足够了 。
2.根据需求明确动画算法 , 这里补充一下优化的减速算法:
3.根据算法计算出来的值更新layout布局即可 。
此类ViewGroup实现简单方便 , 只涉及到几个基本系统API 。如不想写onMeasure方法可继承FrameLayout等已写好onMeasure实现的ViewGroup 。