progress_bar.dart 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. part of 'control_board.dart';
  2. class _ProgressBar extends StatefulWidget {
  3. @override
  4. State<StatefulWidget> createState() => _ProgressBarState();
  5. }
  6. class _ProgressBarState extends State<_ProgressBar> {
  7. final playerController = Get.find<IPlayerController>() as VidPlayerController;
  8. @override
  9. void initState() {
  10. WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
  11. if (mounted) {
  12. playerController.eventHandler.addListener(onControllerEvent);
  13. }
  14. });
  15. super.initState();
  16. }
  17. @override
  18. Widget build(BuildContext context) {
  19. final controller = playerController;
  20. var index = controller.currentFrameIndex.toDouble();
  21. var max = 100.0;
  22. if (index < 0) {
  23. index = 0;
  24. } else {
  25. max = controller.totalFramesCount.toDouble();
  26. }
  27. return SliderTheme(
  28. data: const SliderThemeData(
  29. trackHeight: 18,
  30. // activeTrackColor: Colors.red,
  31. thumbColor: Colors.white,
  32. trackShape: _FullWidthTrackShape(),
  33. ),
  34. child: Slider(
  35. max: max,
  36. value: index,
  37. onChanged: (v) {
  38. controller.pause();
  39. controller.gotoFrame(v.toInt());
  40. },
  41. ),
  42. );
  43. }
  44. void onControllerEvent(Object sender, VidPlayerEvent e) {
  45. if (e is VidPlayerFrameIndexChangeEvent) {
  46. onPlayFrameIndexChanged(e);
  47. }
  48. }
  49. void onPlayFrameIndexChanged(VidPlayerFrameIndexChangeEvent e) {
  50. if (mounted) {
  51. setState(() {});
  52. }
  53. }
  54. }
  55. // https://juejin.cn/post/6959703051586240549
  56. class _FullWidthTrackShape extends RoundedRectSliderTrackShape {
  57. const _FullWidthTrackShape();
  58. @override
  59. Rect getPreferredRect({
  60. required RenderBox parentBox,
  61. Offset offset = Offset.zero,
  62. required SliderThemeData sliderTheme,
  63. bool isEnabled = false,
  64. bool isDiscrete = false,
  65. }) {
  66. final double trackHeight = sliderTheme.trackHeight ?? 2;
  67. final double trackLeft = offset.dx;
  68. final double trackTop =
  69. offset.dy + (parentBox.size.height - trackHeight) / 2;
  70. // 让轨道宽度等于 Slider 宽度
  71. final double trackWidth = parentBox.size.width;
  72. return Rect.fromLTWH(trackLeft, trackTop, trackWidth, trackHeight);
  73. }
  74. }