image_player.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import 'dart:typed_data';
  2. import 'package:fis_measure/view/frame_view/native/frame_view.dart';
  3. import 'package:fis_measure/view/player/controller.dart';
  4. import 'package:fis_measure/view/player/enums.dart';
  5. import 'package:fis_measure/view/player/events.dart';
  6. import 'package:flutter/material.dart';
  7. ///基于图片组件的播放器
  8. class VidImagePlayer extends StatefulWidget {
  9. const VidImagePlayer(
  10. this.controller, {
  11. Key? key,
  12. this.width,
  13. this.height,
  14. }) : super(key: key);
  15. final VidPlayerController controller;
  16. final double? width;
  17. final double? height;
  18. @override
  19. State<StatefulWidget> createState() => _VidImagePlayerState();
  20. }
  21. class _VidImagePlayerState extends State<VidImagePlayer> {
  22. Uint8List? frameBytes;
  23. @override
  24. void initState() {
  25. widget.controller.eventHandler.addListener(onControllerEvent);
  26. super.initState();
  27. }
  28. @override
  29. void didUpdateWidget(covariant VidImagePlayer oldWidget) {
  30. if (oldWidget.controller != widget.controller) {
  31. throw UnsupportedError("[VidTestPlayer] unsupport replace controller.");
  32. }
  33. super.didUpdateWidget(oldWidget);
  34. }
  35. void onControllerEvent(Object sender, VidPlayerEvent e) {
  36. if (e is VidPlayerStatusChangeEvent) {
  37. if (!widget.controller.hasView) {
  38. setState(() {});
  39. }
  40. }
  41. if (e is VidPlayerFrameIndexChangeEvent) {
  42. onFrameChanged(e);
  43. }
  44. if (e is VidPlayerBrightnessChangeEvent) {
  45. updateFrame();
  46. }
  47. if (e is VidPlayerContrastChangeEvent) {
  48. updateFrame();
  49. }
  50. }
  51. void onFrameChanged(VidPlayerFrameIndexChangeEvent e) {
  52. setState(() {
  53. frameBytes = e.bytes;
  54. });
  55. }
  56. void updateFrame() {
  57. setState(() {});
  58. }
  59. @override
  60. Widget build(BuildContext context) {
  61. Widget? child;
  62. switch (widget.controller.status) {
  63. case VidPlayStatus.init:
  64. child = Container(child: const Text("Loading"));
  65. break;
  66. case VidPlayStatus.ready:
  67. child = Container(child: const Text("Ready"));
  68. break;
  69. case VidPlayStatus.loadFail:
  70. child = Container(child: const Text("Load fail"));
  71. break;
  72. case VidPlayStatus.play:
  73. case VidPlayStatus.pause:
  74. // return buildFrameView(context);
  75. // child = Container(
  76. // child: Text(
  77. // widget.controller.currentFrameIndex.toString(),
  78. // ),
  79. // );
  80. child = buildFrameView(context);
  81. break;
  82. case VidPlayStatus.stop:
  83. case VidPlayStatus.dispose:
  84. child = Container(child: const Text("Closed"));
  85. break;
  86. }
  87. return buildBox(context, child);
  88. }
  89. Widget buildBox(BuildContext context, Widget child) {
  90. return Container(
  91. alignment: Alignment.center,
  92. child: child,
  93. );
  94. }
  95. Widget buildFrameView(BuildContext context) {
  96. if (frameBytes != null) {
  97. final size = MediaQuery.of(context).size;
  98. return VidFrameView(
  99. frameBytes!,
  100. // width: widget.width,
  101. // height: widget.height,
  102. width: size.width,
  103. height: size.height,
  104. );
  105. } else {
  106. return Container();
  107. }
  108. }
  109. @override
  110. void dispose() {
  111. widget.controller.eventHandler.removeListener(onControllerEvent);
  112. super.dispose();
  113. }
  114. }