本文作者
作者:TeaOf
链接:
https://juejin.im/post/5cbc532de51d456e5e035f42
本文由作者授权发布。
1 前言最近刚写完了一个弹幕库 Muti-Barrage,它具有如下功能:
自定义多视图(弹幕必备)
碰撞检测
检测触摸事件
设置发送间隔
设置速度生成区间
循环播放
花费了不少闲暇的时间,故打算在此总结一下。
老规矩,在写下文之前,我们先看一下效果:
单视图弹幕应用
多视图弹幕例子
目录
会遇到的坑
多视图如何处理
如何防碰撞
触摸事件如何检测
我们先看一下弹幕的产生过程:
整体并不难, BarrageAdapter负责管理数据, BarrageView负责管理视图,数据被加入 BarrageAdapter后,单线程的线程池控制子 View 的产生速度,定时发送消息给 BarrageAdapterHandler,生成弹幕的子 View 之后经过一些列操作添加进 BarrageView中。
3 代码一览这里,我不会把整段代码都贴上,而是根据弹幕产生过程逐步展开。
1.数据定义
所有弹幕的数据都必须实现 DataSource接口, getType()方法可以帮我们确定视图的布局。
public interface DataSource {
// 返回当前的类型
int getType();
// 返回生成的时间
long getShowTime();
}
2.定义 IBarrageView接口
BarrageView需要实现的方法,让 调用
public interface IBarrageView {
// 添加视图
void addBarrageItem(View view);
// 获取是否存在缓存
View getCacheView(int type);
// 发送View间隔
long getInterval();
// 循环的次数
int getRepeat();
}
3.数据添加
为了约束数据类型,我们需要在 BarrageAdapter使用范型,也就是
public abstract class BarrageAdapter<T extends DataSource>implements View.OnClickListener {
}
下面我们从数据的添加入口讲起:
/**
* 添加一组数据
*
* @param dataList 一组数据
*/
public void addList(List dataList) {
if (dataList == null || dataList.size() == 0)
return;
int len = dataList.size();
mDataList.addAll(dataList);
mService.submit(new DelayRunnable(len));
}
mDataList是我们存放数据的 Li