247 lines
7.6 KiB
Dart
247 lines
7.6 KiB
Dart
import 'package:flutter/animation.dart';
|
||
import 'package:flutter/cupertino.dart';
|
||
import 'package:flutter_svga/flutter_svga.dart';
|
||
import 'package:yumi/shared/tools/sc_path_utils.dart';
|
||
import 'package:yumi/shared/data_sources/sources/local/file_cache_manager.dart';
|
||
import 'package:tancent_vap/widgets/vap_view.dart';
|
||
|
||
import 'package:yumi/shared/tools/sc_gift_vap_svga_manager.dart';
|
||
|
||
// class EntranceVapSvgaManager {
|
||
// static EntranceVapSvgaManager? _instance;
|
||
//
|
||
// EntranceVapSvgaManager._internal();
|
||
//
|
||
// factory EntranceVapSvgaManager() =>
|
||
// _instance ??= EntranceVapSvgaManager._internal();
|
||
//
|
||
// // 使用 SCPriorityQueue 替代简单列表
|
||
// final SCPriorityQueue<SCVapTask> _taskQueue = SCPriorityQueue<SCVapTask>(
|
||
// (a, b) => b.priority.compareTo(a.priority),
|
||
// );
|
||
// VapController? _roomGiftvapController;
|
||
// SVGAAnimationController? _roomGiftsvgaController;
|
||
// bool _isPlaying = false;
|
||
// bool _isDisposed = false;
|
||
//
|
||
// // 绑定控制器
|
||
// void bindEntranceVapController(VapController vapController) {
|
||
// _isDisposed = false;
|
||
// _roomGiftvapController = vapController;
|
||
// _roomGiftvapController?.setAnimListener(
|
||
// onVideoStart: () {},
|
||
// onVideoComplete: () {
|
||
// _handleControllerState();
|
||
// },
|
||
// onFailed: (code, type, msg) {
|
||
// _handleControllerState();
|
||
// },
|
||
// );
|
||
// }
|
||
//
|
||
// void bindEntranceSvgaController(SVGAAnimationController svgaController) {
|
||
// _isDisposed = false;
|
||
// _roomGiftsvgaController = svgaController;
|
||
// _roomGiftsvgaController?.addStatusListener((AnimationStatus status) {
|
||
// if (status.isCompleted) {
|
||
// _isPlaying = false;
|
||
// _roomGiftsvgaController?.reset();
|
||
// _playNext();
|
||
// }
|
||
// });
|
||
// }
|
||
//
|
||
// // 播放任务
|
||
// void play(
|
||
// String path, {
|
||
// int priority = 0,
|
||
// Map<String, String>? customResources,
|
||
// }) {
|
||
// if (_isDisposed) return;
|
||
// final task = SCVapTask(
|
||
// path: path,
|
||
// priority: priority,
|
||
// customResources: customResources,
|
||
// );
|
||
//
|
||
// _taskQueue.add(task);
|
||
// if (!_isPlaying) {
|
||
// _playNext();
|
||
// }
|
||
// }
|
||
//
|
||
// // 播放下一个任务
|
||
// Future<void> _playNext() async {
|
||
// if (_isDisposed || _taskQueue.isEmpty || _isPlaying) return;
|
||
//
|
||
// final task = _taskQueue.removeFirst();
|
||
// _isPlaying = true;
|
||
// try {
|
||
// final pathType = SCPathUtils.getPathType(task.path);
|
||
// if (pathType == PathType.asset) {
|
||
// await _playAsset(task);
|
||
// } else if (pathType == PathType.file) {
|
||
// await _playFile(task);
|
||
// } else if (pathType == PathType.network) {
|
||
// await _playNetwork(task);
|
||
// }
|
||
// } catch (e, s) {
|
||
// print('VAP_SVGA播放失败: $e\n$s');
|
||
// _isPlaying = false;
|
||
// } finally {
|
||
// // 确保状态正确重置
|
||
// if (!_isDisposed) {
|
||
// _playNext();
|
||
// }
|
||
// }
|
||
// }
|
||
//
|
||
// // 播放资源文件
|
||
// Future<void> _playAsset(SCVapTask task) async {
|
||
// if (_isDisposed) return;
|
||
// if (SCPathUtils.getFileExtension(task.path).toLowerCase() == ".svga") {
|
||
// MovieEntity entity;
|
||
// if (SCGiftVapSvgaManager().videoItemCache.containsKey(task.path)) {
|
||
// entity = SCGiftVapSvgaManager().videoItemCache[task.path]!;
|
||
// } else {
|
||
// entity = await SVGAParser.shared.decodeFromAssets(task.path);
|
||
// SCGiftVapSvgaManager().videoItemCache[task.path] = entity;
|
||
// }
|
||
// _roomGiftsvgaController?.videoItem = entity;
|
||
// _roomGiftsvgaController?.reset();
|
||
// _roomGiftsvgaController?.forward();
|
||
// } else {
|
||
// await _roomGiftvapController?.playAsset(task.path);
|
||
// }
|
||
// }
|
||
//
|
||
// // 播放本地文件
|
||
// Future<void> _playFile(SCVapTask task) async {
|
||
// if (_isDisposed || _roomGiftvapController == null) return;
|
||
// await _roomGiftvapController!.playFile(task.path);
|
||
// }
|
||
//
|
||
// // 播放网络资源
|
||
// Future<void> _playNetwork(SCVapTask task) async {
|
||
// if (_isDisposed) return;
|
||
// if (SCPathUtils.getFileExtension(task.path).toLowerCase() == ".svga") {
|
||
// MovieEntity? entity;
|
||
// if (SCGiftVapSvgaManager().videoItemCache.containsKey(task.path)) {
|
||
// entity = SCGiftVapSvgaManager().videoItemCache[task.path]!;
|
||
// entity.autorelease = false;
|
||
// } else {
|
||
// try {
|
||
// entity = await SVGAParser.shared.decodeFromURL(task.path);
|
||
// entity.autorelease = false;
|
||
// SCGiftVapSvgaManager().videoItemCache[task.path] = entity;
|
||
// } catch (e) {
|
||
// _isPlaying = false;
|
||
// print('svga解析出错:$e');
|
||
// }
|
||
// }
|
||
// if (entity != null) {
|
||
// _roomGiftsvgaController?.videoItem = entity;
|
||
// _roomGiftsvgaController?.reset();
|
||
// _roomGiftsvgaController?.forward();
|
||
// }
|
||
// } else {
|
||
// final file = await FileCacheManager.getInstance().getFile(url: task.path);
|
||
// if (file != null && !_isDisposed) {
|
||
// await _playFile(
|
||
// SCVapTask(
|
||
// path: file.path,
|
||
// priority: task.priority,
|
||
// customResources: task.customResources,
|
||
// ),
|
||
// );
|
||
// }
|
||
// }
|
||
// }
|
||
//
|
||
// // 处理控制器状态变化
|
||
// void _handleControllerState() {
|
||
// if (_roomGiftvapController != null && !_isDisposed) {
|
||
// _isPlaying = false;
|
||
// // 延迟一小段时间后播放下一个,避免状态冲突
|
||
// Future.delayed(const Duration(milliseconds: 50), _playNext);
|
||
// }
|
||
// }
|
||
//
|
||
// // 释放资源
|
||
// void dispose() {
|
||
// _isDisposed = true;
|
||
// _isPlaying = false;
|
||
// _taskQueue.clear();
|
||
// _roomGiftvapController?.stop();
|
||
// _roomGiftvapController?.dispose();
|
||
// _roomGiftvapController = null;
|
||
// _roomGiftsvgaController?.stop();
|
||
// _roomGiftsvgaController?.dispose();
|
||
// _roomGiftsvgaController = null;
|
||
// }
|
||
//
|
||
// // 清除所有任务
|
||
// void clearTasks() {
|
||
// _taskQueue.clear();
|
||
// }
|
||
//
|
||
// // 获取当前队列状态
|
||
// VapQueueStatus get queueStatus {
|
||
// return VapQueueStatus(
|
||
// isPlaying: _isPlaying,
|
||
// currentTask: _taskQueue.isNotEmpty ? _taskQueue.first : null,
|
||
// queueLength: _taskQueue.length,
|
||
// pendingTasks: List.unmodifiable(_taskQueue.unorderedElements),
|
||
// );
|
||
// }
|
||
// }
|
||
|
||
// 任务模型
|
||
class SCVapTask implements Comparable<SCVapTask> {
|
||
final String path;
|
||
final int priority; // 优先级 (数值越高越优先)
|
||
final Map<String, String>? customResources; // 自定义资源
|
||
|
||
SCVapTask({required this.path, this.priority = 0, this.customResources});
|
||
|
||
@override
|
||
int compareTo(SCVapTask other) {
|
||
// 先按优先级排序
|
||
if (priority != other.priority) {
|
||
return priority.compareTo(other.priority);
|
||
}
|
||
|
||
// 相同优先级按添加时间排序(先进先出)
|
||
return hashCode.compareTo(other.hashCode);
|
||
}
|
||
}
|
||
// 优先队列实现
|
||
class SCPriorityQueue<E> {
|
||
final List<E> _els = [];
|
||
final Comparator<E> _cmp;
|
||
|
||
SCPriorityQueue(this._cmp);
|
||
|
||
void add(E element) {
|
||
_els.add(element);
|
||
_els.sort(_cmp);
|
||
}
|
||
|
||
E removeFirst() {
|
||
if (isEmpty) throw StateError("No elements");
|
||
return _els.removeAt(0);
|
||
}
|
||
|
||
E? get first => isEmpty ? null : _els.first;
|
||
|
||
bool get isEmpty => _els.isEmpty;
|
||
|
||
bool get isNotEmpty => _els.isNotEmpty;
|
||
|
||
int get length => _els.length;
|
||
|
||
void clear() => _els.clear();
|
||
|
||
List<E> get unorderedElements => List.from(_els);
|
||
}
|