val debug = DebugConfig(this)
val common = CommonConfig(this)
val text = TextConfig(this)
val underline = UnderlineConfig(this)
val scroll = ScrollLayerConfig(this)
val top = TopCenterLayerConfig(this)
val bottom = BottomCenterLayerConfig(this)
Copyright (c) 2022 ByteDance Inc
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
DanmakuRenderEngine
DanmakuRenderEngine 是一个轻量级、高扩展性的通用弹幕库,主要特性:
下载 Demo >>>
正在使用 DanmakuRenderEngine 的应用
快速接入
添加仓库源:
在依赖中添加:
在最简单的场景下,仅需要四步即可接入并开始播放弹幕:
DanmakuViewdanmakuView.controller拿到弹幕的控制器DanmakuControllerTextData,默认情况仅需要填入text、LayerType和showAtTime字段controller.setData()设置数据,然后使用controller.start()即可开始播放弹幕时间轴同步
弹幕控制
DanmakuController提供了四个与时间轴控制相关的方法:播放同步
按照业界弹幕较通用的实现逻辑,播放器的回调和
DanmakuController控制方法对应如下,如果有特殊需求也可以对 DanmakuRenderEngine 框架的控制逻辑进行定制:
其他形态的业务
DanmakuRenderEngine 弹幕库并不与视频播放逻辑耦合,如果想要实现类似 QQ 空间的图片弹幕,做法也是类似的。
自定义运动方式
DanmakuRenderEngine 弹幕库的渲染结构根据运动方式的不同被分为不同的层(Layer),
每个渲染层自己管理排版和渲染,渲染层之间则由
z-index属性来控制层级顺序。DanmakuRenderEngine 弹幕库默认情况下支持三种弹幕的运动方式:
若想开发自定义的运动方式,只需要按照
IRenderLayer的要求对接口进行实现,调用DanmakuController.addRenderLayer()进行注册,然后在弹幕数据中指定
LayerType为你定义的Layer,DanmakuRenderEngine 就会在渲染时自动将这条弹幕交给对应的Layer进行排版和绘制了。自定义弹幕样式
定义
DanmakuRenderEngine 弹幕库在设计时将一条弹幕分成了数据实体(DanmakuData)和绘制实体(DrawItem):
因此,想要自定义弹幕样式需要实现三个类:
然后调用
DanmakuController.registerDrawItemFactory对自定义的工厂类进行注册,这样 DanmakuRenderEngine 在遇到自定义的
CustomDanmakuData时就会使用会注册的工厂类生成CustomDrawItem进行渲染了。实现
基于组合优于继承的思想,DanmakuRenderEngine 弹幕库默认提供文字(TextData)和图片(BitmapData)两种弹幕样式,
高级自定义弹幕样式则由业务方将上述两种样式组合而成。
自定义的Data和DrawItem需要定义相同的层级结构,
在bindData或者x、y等属性发生变化时可以将新的值向下进行分发。
以西瓜视频的弹幕样式为例,在文字后面会跟一个点赞图标和点赞数:
而弹幕数据结构组合如下:
同时在DrawItem内,在绘制时能拿到绘制时的Canvas,
上图中弹幕点赞结构的背景,就是使用Canvas绘制的。
弹幕设置
需求
通常情况下我们会有对弹幕属性进行修改的需求,例如:
在 DanmakuRenderEngine 框架中,主要通过
DanmakuController.config来对弹幕进行控制层叠与优先级
根据实际需求,在配置上设计了类似于CSS的层叠与优先级的概念。
首先
Config中是全局配置字段,根据作用范围分为:以文字的
TextConfig为例,有size、color等属性,而同时TextData中也有相同作用的
TextSize、TextColor等属性。若
TextData定义了某条属性时,以TextData中定义的为准,在
TextData中未定义时,则以Config中定义的为准。例如如果在正文的
TextData中不对TextSize赋值,而在点赞数字的TextData中对TextSize赋值,则当我们在进入全屏时增加
Config.text中的size属性时,就能对弹幕的正文字体大小进行放大,同时点赞数字的大小则始终保持不变。命令和事件
对于一个弹幕框架,通常来说会有两种需求:
DanmakuRenderEngine框架针对这两类需求,设计了命令和事件两套机制来进行处理
命令
命令(DanmakuCommand)用于业务方通知弹幕框架做一些事情,
主入口是
DanmakuController.executeCommand(),例如:事件
事件(DanmakuEvent)用于弹幕框架通知业务方一些事情发生了,
业务方可以通过
DanmakuController.addEventListener()来注册监听,在回调中通过
DanmakuEvent.what属性来判断Event的类型,例如:蒙版弹幕
「蒙版弹幕」是一种高级弹幕功能,能实现「不遮挡人像」的效果,
即开启该功能后,弹幕就不会再覆盖人像,而是呈现从人体身后穿过的效果。
DanmakuRenderEngine 框架内置了该功能的实现,只需简单几步即可实现「蒙版弹幕」:
Path的形式组装成MaskData数据结构MaskData数据和其他弹幕数据一样设置给DanmakuControllerDanmakuController.config.mask.enable = true(上述代码可以参考Demo工程中的SmartMaskActivity.kt)
需要注意的是:
MaskData遮罩的帧率没有限制,但出于性能和数据传输方面的考虑,一般来说不会高于30Hz(大于10Hz时效果已经非常好了), 同时 DanmakuRenderEngine 框架也支持动态帧率的遮罩,在组装MaskData时指定每一项数据的起止时间即可Q&A
Q1:我可以动态插入DanmakuView吗?
A:可以。需要时可以new一个
DanmakuView并覆盖到视频画面上方,只要保证DanmakuView和视频画面的大小始终保持一致即可(例如在切换全屏时)。Q2:我可以先播放,再设置弹幕数据吗?
A:可以。但
showAtTime在设置时间点之前的弹幕本次播放不会被显示(如果往前Seek,这些弹幕仍然可以显示出来)。License