最近遇到需求,需要在某张用户发表的图片中展示评论,方式是以淡入淡出的弹幕形式。需求为淡入事件t1->淡出t2,所有弹幕依次开始播放,中间一定的时间间隔deltaT。仔细考虑之后,想到以下实现方式,现总结下来并进行实现、分析以及比较。
不妨认定弹幕的画布为BarrageView;每条弹幕的绘制为BarrageItemView。
- 属性动画
从只有一条弹幕开始思考,我们需要设计一个属性动画,负责淡入:
在该动画的完成回调函数onAnimationEnd中启动淡出动画,在淡出动画的完成回调函数中,对该BarrageItemView进行remove操作,这样就完成了一条弹幕的显示过程。
多条弹幕展示时也是同样的逻辑。
使用这种方法,弹幕的依次播放在实现上是一个难点:我们需要另开一个通知线程(计时器),在每隔deltaT时间,对BarrageView(弹幕画布)进行通知,告诉它你可以播放一条新的弹幕了。
于是在每个BarrageView中我们需要建一个handle来对通知消息进行处理,当BarrrageView是作为ListView或者RecyclerView的一个Item时,通过用户的活动,可能会展示大量的BarrageView,这样会构建出大量的Handler,对系统性能也是一个挑战。不过如果处于RecyclerView的Item中,在RecyclerView对ViewHolder进行重用时,也可以在Handler实现中进行判断和重用,以最大程度减少资源浪费。这样的实现方法会出现一些的问题:太多的BarrageItemView和属性动画的创建。这样的做法不仅会影响应用的性能,而且每条弹幕和属性动画的管理都会对代码实现提出挑战。
另一个需要注意的点是,弹幕动画往往不是稳定的从开始播放到结束,用户可以进行暂停、关闭、打开弹幕等操作。这一系列管理功能决定了我们在使用属性动画时必须记录每个当前正在