Android自定义简单的弹幕控件思路

在想自定义一个控件前,需要 分析一个控件的特性:(分析实际需求,拆解实际需求)

1.弹幕行数不一定,高人气直播间行数很高,低人气直播间行数很低,所以 弹幕行数 会根据用户 发弹幕的速度升级而升级

2.边缘的时候,是不可接收弹幕的状态。所以每一行会有一个不可接收弹幕的状态。这个 状态由多种条件控制,最直观的一点是一条弹幕显示了一半的时候,是不可接收的。(大概观察了下,上条弹幕距离右边一段距离后,才能进入弹幕接收状态,有一个min值)

3. 弹幕有不同的速度,新弹幕如果追上了老弹幕,新弹幕和老弹幕 重复的部分,将会是新弹幕覆盖老弹幕

4. 注意左边出去的弹幕,完全不在 界面里了,需要cancel掉

5.每一个弹幕需要有一个元数据类,但是 不需要同时缓存view, 否则需要写一个view池,开销不小,直接draw text即可。

元数据类包括: 速度,当前坐标,宽,高(通过某个api可以获得对应文字假设draw后的宽高,好像是get clip bounds),颜色(元数据类不一定是这样,可以直接指向常量也行,因为行是固定的,所以位置,高度都是固定的)。

 所以这个控件的逻辑难点在于入口的弹幕获取。

这里进行更细致的分析:

1.draw的时候如何知道要绘制什么弹幕?

bulletScreen元数据:文本,位置,速度。提供draw方法,每次draw的时候都会将当前位置+速度*刷新时间,偏移一段距离

比如现在有N行,那么需要有N个容器来分别存放每一行的bulletScreen。然后直接调用每一个bulletScreen的draw方法即可。当一个bulletScreen完全移出屏幕后,把自己从容器中移除。在可获取弹幕状态的时候获取到弹幕,bulletScreen容器就会新增一个元素。看来这里不可避免地要用到对象池来做好缓存了。

2.何时添加元素到 对应行中?

控件.addBulletScreen(BulletScreenPool.get())

然后会找到可接收弹幕的一行, 添加到对应行的bulletScreen容器中。

如果没有任何一行可以接收,需要添加到控件内部的 缓存区中(和bulletScreen缓存池区分开)。在每个bulletScreen数据中,还要加上一个boolean isLastInLine,如果为true,还承担计算任务,一旦完全显示在屏幕中,并且超过了右margin min,这一行就会处于可接受弹幕的状态。并且会去缓冲区查找是否有新的元素。

差不多就是 这样,以后有这样的需求就自己写个控件吧。

猜你喜欢

转载自blog.csdn.net/qq_36523667/article/details/81348572