源代码地址:请点击这里
需求
两种显示方式:
- 主播全屏,其他游客悬浮在右侧。下面简称大小屏模式。
- 所有人等分屏幕。下面简称等分模式。
分析
- 最多4人连麦,明确这点方便定制坐标算法。
- 自定义的 ViewGroup 最好分别提供等分模式和大小屏模式的边距设置接口,便于修改。
- SDK 自己管理了 TextureView 的绘制和测量,所以 ViewGroup 需要复写 onMeasure 方法以通知 TextureView 测量和绘制。
- 一个计算 0.0f ~ 1.0f 逐渐减速的函数,给动画过程做支撑。
- 一个记录坐标的数据模型。和一个根据现有 Child View 的数量计算两种布局模式下,每个 View 摆放位置的函数。
实现
1.定义坐标数据模型
private data class ViewLayoutInfo(
var originalLeft: Int = 0,// original开头的为动画开始前的起始值
var originalTop: Int = 0,
var originalRight: Int = 0,
var originalBottom: Int = 0,
var left: Float = 0.0f,// 无前缀的为动画过程中的临时值
var top: Float = 0.0f,
var right: Float = 0.0f,
var bottom: Float = 0.0f,
var toLeft: Int = 0,// to开头的为动画目标值
var toTop: Int = 0,
var toRight: Int = 0,
var toBottom: Int = 0,
var progress: Float = 0.0f,// 进度 0.0f ~ 1.0f,用于控制 Alpha 动画
var isAlpha: Boolean = false,// 透明动画,新添加的执行此动画
var isConverted: Boolean = false,// 控制 progress 反转的标记
var waitingDestroy: Boolean = false,// 结束后销毁 View 的标记
var pos: Int = 0// 记录自己索引,以便销毁
) {
init {
left = originalLeft.toFloat()
top = originalTop.toFloat()
right = originalRight.toFloat()
bottom = originalBottom.toFloat()
}
}
以上,记录了执行动画和销毁View所需的数据。(于源码中第352行)
2.计算不同展示模式下View坐标的函数
if (layoutTopicMode)