https://github.com/predidit/canvas_danmaku
简易高性能的flutter弹幕组件
https://github.com/predidit/canvas_danmaku
danmaku flutter
Last synced: about 2 months ago
JSON representation
简易高性能的flutter弹幕组件
- Host: GitHub
- URL: https://github.com/predidit/canvas_danmaku
- Owner: Predidit
- License: mit
- Created: 2024-05-30T10:19:54.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-11-17T05:14:04.000Z (11 months ago)
- Last Synced: 2024-12-04T13:24:09.429Z (10 months ago)
- Topics: danmaku, flutter
- Language: Dart
- Homepage: https://pub.dev/packages/canvas_danmaku
- Size: 346 KB
- Stars: 8
- Watchers: 1
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
## 概述
一个使用 `CustomPainter` 进行直接绘制的简易高性能 `flutter` 弹幕组件
## 示例
``` yaml
dependencies:
canvas_danmaku: ^0.2.7
```Example:
```dart
import 'package:canvas_danmaku/canvas_danmaku.dart';
class _DanmakuPageState extends State {
late DanmakuController _controller;
@override
Widget build(BuildContext context) {
return Stack(
children: [
// 你的自定义组件,例如一个播放器
Container(),
// 弹幕组件
DanmakuScreen(
createdController: (e) {
_controller = e;
},
option: DanmakuOption(),
),
],
);
}
}```
## 说明
本项目接口设计参考 `ns_danmaku` ,支持 `ns_danmaku` 的大部分功能。本项目与其的区别在于弹幕绘制原理。
## 特性
#### 高性能
`canvas_danmaku` 通过底层的 `CustomPainter` 直接绘制弹幕。这可以减少 Flutter 框架中组件的数量,降低了组件树的复杂度,从而提高性能。
`canvas_danmaku` 特别优化了过度重绘问题。滚动弹幕与静止弹幕分层处理,静止弹幕仅在需要时重绘。此外,当没有弹幕时,`canvas_danmaku` 会优雅地暂停所有绘制,并在重新出现弹幕时优雅地重新开始绘制。
`canvas_danmaku` 渲染准备与渲染操作异步。渲染准备在弹幕添加时进行并缓存,每帧直接使用缓存而无需渲染准备。渲染缓存只在弹幕添加时生成,或在弹幕属性变动时(例如更改字体)重新生成。
#### 简单
`canvas_danmaku` 不依赖于上下文,不需要传递 `BuildContext`。
`canvas_danmaku` 也不需要传递 弹幕容器高度/弹幕轨道数 等控制弹幕布局的信息。
`canvas_danmaku` 是响应式的,弹幕容器高度会根据父组件自适应,弹幕轨道数根据当前容器高度与字体大小动态计算。
`canvas_danmaku` 弹幕容器属性(字体大小/字体透明度等)可在容器运行时热更新,渲染缓存将会在发生热更新时优雅地销毁并重新生成。
## 局限
如前文所述,本项目绘制的弹幕本质是一段动画,而非一组小组件。故本项目绘制的弹幕不具有交互性,如果您需要点击弹幕来实现的交互操作,本项目并不能满足需求。
## 致谢
[xiaoyaocz/ns_danmaku](https://github.com/xiaoyaocz/flutter_ns_danmaku) 本项目的灵感来自 ns_danmaku ,一个非常优秀的项目。