You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.3 KiB
87 lines
2.3 KiB
import 'dart:collection';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_svga/flutter_svga.dart';
|
|
import 'package:get/get.dart';
|
|
|
|
/// SVGA 动画项
|
|
class SvgaAnimationItem {
|
|
final String svgaFile;
|
|
final int? targetUserId; // 接收礼物的用户ID
|
|
final int? senderUserId; // 发送礼物的用户ID
|
|
final String? giftProductId; // 礼物产品ID
|
|
|
|
SvgaAnimationItem({
|
|
required this.svgaFile,
|
|
this.targetUserId,
|
|
this.senderUserId,
|
|
this.giftProductId,
|
|
});
|
|
}
|
|
|
|
/// SVGA 动画播放队列管理器
|
|
/// 注意:由于 SVGAAnimationController 需要 vsync,实际播放需要在 Widget 中完成
|
|
/// 这个管理器只负责管理队列,实际的播放需要通过回调通知外部 Widget
|
|
class SvgaPlayerManager extends GetxController {
|
|
static SvgaPlayerManager? _instance;
|
|
static SvgaPlayerManager get instance {
|
|
_instance ??= Get.put(SvgaPlayerManager());
|
|
return _instance!;
|
|
}
|
|
|
|
final Queue<SvgaAnimationItem> _animationQueue = Queue<SvgaAnimationItem>();
|
|
final Rx<SvgaAnimationItem?> currentItem = Rx<SvgaAnimationItem?>(null);
|
|
final RxBool isPlaying = false.obs;
|
|
|
|
/// 添加动画到队列
|
|
void addToQueue(SvgaAnimationItem item) {
|
|
_animationQueue.add(item);
|
|
_playNext();
|
|
}
|
|
|
|
/// 播放下一个动画
|
|
void _playNext() {
|
|
if (isPlaying.value || _animationQueue.isEmpty) {
|
|
return;
|
|
}
|
|
|
|
final item = _animationQueue.removeFirst();
|
|
currentItem.value = item;
|
|
isPlaying.value = true;
|
|
print('✅ SVGA 动画已添加到播放队列: ${item.svgaFile}');
|
|
}
|
|
|
|
/// 标记当前动画播放完成
|
|
void onAnimationFinished() {
|
|
print('✅ SVGA 动画播放完成55');
|
|
isPlaying.value = false;
|
|
currentItem.value = null;
|
|
// 播放下一个
|
|
_playNext();
|
|
}
|
|
|
|
/// 标记当前动画播放失败
|
|
void onAnimationError(String error) {
|
|
print('❌ SVGA 动画播放失败: $error');
|
|
isPlaying.value = false;
|
|
currentItem.value = null;
|
|
// 继续播放下一个
|
|
_playNext();
|
|
}
|
|
|
|
/// 停止当前播放
|
|
void stop() {
|
|
isPlaying.value = false;
|
|
currentItem.value = null;
|
|
}
|
|
|
|
/// 清空队列
|
|
void clearQueue() {
|
|
stop();
|
|
_animationQueue.clear();
|
|
Get.log('clearQueue>>>81');
|
|
}
|
|
|
|
/// 获取队列长度
|
|
int get queueLength => _animationQueue.length;
|
|
}
|
|
|