通用弹幕实现

本文介绍了Android弹幕系统的设计与实现,包括IBarrageView、BarrageView及AbsBarrageController的职责。AbsBarrageController维护等待、准备和运行的弹幕队列,使用计时器来调度弹幕的播放。通过onPlayBarrage方法处理弹幕状态转换,以及在画布上的绘制和触摸事件。此外,还详细说明了如何实现随机线弹幕控制器RandomLineBarrageController,以及弹幕对象AbsBarrage的状态管理和生命周期。
摘要由CSDN通过智能技术生成

IBarrageView

interface IBarrageView {

    // 弹幕是否可点击
    fun setEnableTouch(enable: Boolean)

    // 添加弹幕控制器
    fun addController(controller: AbsBarrageController, priority: Int = 0)

    // 移除弹幕控制器
    fun removeController(controller: AbsBarrageController)

    fun clear()
}

BarrageView

  • 内部维护 List<BarrageController>
  • 重写 onDraw、onTouchEvent 和 onDetachedFromWindow,进而调用 BarrageController 对应方法
class BarrageView {

    override fun onDraw(canvas: Canvas) {
        if (controllerList.size == 0) {
            canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
        }
        loopWithIndex(controllerList.size) {
            controllerList[it].apply {
                draw(canvas)
            }
            false
        }
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        if (mEnableTouch) {
            when (event.action) {
                MotionEvent.ACTION_DOWN -> {
                    mTouchController = null
                    for (barrageController in controllerList) {
                        if (barrageController.onTouchEvent(event)) {
                            mTouchController = barrageController
                            return true
                        }
                    }
                }
                MotionEvent.ACTION_UP -> {
                    mTouchController?.let {
                        return it.onTouchEvent(event)
                    }
                }
                MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_MOVE -> {
                    mTouchController?.let {
                        return it.onTouchEvent(event)
                    }
                }
            }
            return super.onTouchEvent(event)
        } else {
            return super.onTouchEvent(event)
        }
    }

    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow() // 清理 Controller,防止空指针
        controllerList.forEach {
            it.release()
        }
        controllerList.clear()
    }
}

AbsBarrageController

内部维护三个队列,分别为 waitingList、preparingList、runningList

内部维护计时器,通过 AnimationUpdateListener 计算时间差,并调用 onPlayBarrage 抽象方法,如果三个队列都为空,则停止计时器

abstract fun onPlayBarrage(runningList: MutableList<AbsBarrage>, deltaTime: Float)

@MainThread
private fun initAnimation(): ValueAnimator {
    val animator = ValueAnimator.ofFloat(0F, AbsBarrageContr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

little-sparrow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值