From 99a3ff81e0c4b651233a74c1f0dc4e71c4b6b279 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Thu, 3 Aug 2023 22:54:37 +0800 Subject: [PATCH] =?UTF-8?q?mod:=20=E6=BB=91=E5=8A=A8=E6=89=8B=E5=8A=BF?= =?UTF-8?q?=E8=BF=9B=E5=85=A5/=E9=80=80=E5=87=BA=E5=85=A8=E5=B1=8F?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/plugin/pl_player/view.dart | 102 +++++++++++++----- .../pl_player/widgets/bottom_control.dart | 62 +++-------- 2 files changed, 92 insertions(+), 72 deletions(-) diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 6c51508d..07745901 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:audio_video_progress_bar/audio_video_progress_bar.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:get/get.dart'; import 'package:media_kit/media_kit.dart'; @@ -15,11 +16,11 @@ import 'package:pilipala/utils/feed_back.dart'; import 'package:screen_brightness/screen_brightness.dart'; import 'package:volume_controller/volume_controller.dart'; +import 'utils/fullscreen.dart'; import 'widgets/backward_seek.dart'; import 'widgets/bottom_control.dart'; import 'widgets/common_btn.dart'; import 'widgets/forward_seek.dart'; -import 'widgets/play_pause_btn.dart'; class PLVideoPlayer extends StatefulWidget { final PlPlayerController controller; @@ -55,6 +56,8 @@ class _PLVideoPlayerState extends State bool _volumeIndicator = false; Timer? _volumeTimer; + double _distance = 0.0; + bool _volumeInterceptEventStream = false; void onDoubleTapSeekBackward() { @@ -142,15 +145,65 @@ class _PLVideoPlayerState extends State }); } + Future triggerFullScreen() async { + PlPlayerController _ = widget.controller; + if (!_.isFullScreen.value) { + /// 按照视频宽高比决定全屏方向 + if (_.direction.value == 'horizontal') { + /// 进入全屏 + await enterFullScreen(); + // 横屏 + await landScape(); + } else { + // 竖屏 + await verticalScreen(); + } + + _.toggleFullScreen(true); + var result = await showDialog( + context: Get.context!, + useSafeArea: false, + builder: (context) => Dialog.fullscreen( + child: Scaffold( + backgroundColor: Colors.black, + appBar: AppBar( + primary: false, + toolbarHeight: 0, + backgroundColor: Colors.black, + systemOverlayStyle: SystemUiOverlayStyle.light, + ), + body: SafeArea( + bottom: true, + child: PLVideoPlayer( + controller: _, + headerControl: _.headerControl, + ), + ), + ), + ), + ); + if (result == null) { + // 退出全屏 + exitFullScreen(); + await verticalScreen(); + _.toggleFullScreen(false); + } + } else { + Get.back(); + exitFullScreen(); + await verticalScreen(); + _.toggleFullScreen(false); + } + } + @override void dispose() { - super.dispose(); animationController.dispose(); + super.dispose(); } @override Widget build(BuildContext context) { - print('🌹🌹🌹🌹🌹:33333'); final _ = widget.controller; Color colorTheme = Theme.of(context).colorScheme.primary; TextStyle subTitleStyle = const TextStyle( @@ -389,7 +442,6 @@ class _PLVideoPlayerState extends State // 双击左边区域 👈 onDoubleTapSeekBackward(); } else if (tapPosition < sectionWidth * 2) { - print('🌹🌹🌹🌹🌹:333356555553'); if (_.playerStatus.status.value == PlayerStatus.playing) { _.togglePlay(); } else { @@ -415,23 +467,36 @@ class _PLVideoPlayerState extends State onHorizontalDragUpdate: (DragUpdateDetails details) {}, onHorizontalDragEnd: (DragEndDetails details) {}, // 垂直方向 音量/亮度调节 - onVerticalDragUpdate: (DragUpdateDetails details) { + onVerticalDragUpdate: (DragUpdateDetails details) async { final totalWidth = MediaQuery.of(context).size.width; final tapPosition = details.localPosition.dx; final sectionWidth = totalWidth / 3; - + final delta = details.delta.dy; if (tapPosition < sectionWidth) { // 左边区域 👈 - final delta = details.delta.dy; final brightness = _brightnessValue - delta / 100.0; final result = brightness.clamp(0.0, 1.0); setBrightness(result); } else if (tapPosition < sectionWidth * 2) { // 全屏 - print('全屏'); + final double dy = details.delta.dy; + const double threshold = 7.0; // 滑动阈值 + if (dy > _distance && dy > threshold) { + if (!_.isFullScreen.value) { + await triggerFullScreen(); + } + _distance = 0.0; + } else if (dy < _distance && dy < -threshold) { + if (_.isFullScreen.value) { + await triggerFullScreen(); + } + _distance = 0.0; + } + _distance = dy; + + // triggerFullScreen(); } else { // 右边区域 👈 - final delta = details.delta.dy; final volume = _volumeValue - delta / 100.0; final result = volume.clamp(0.0, 1.0); setVolume(result); @@ -463,7 +528,9 @@ class _PLVideoPlayerState extends State controller: animationController, visible: !_.controlsLock.value && _.showControls.value, position: 'bottom', - child: BottomControl(controller: widget.controller), + child: BottomControl( + controller: widget.controller, + triggerFullScreen: triggerFullScreen), ), ), ], @@ -660,18 +727,3 @@ class _PLVideoPlayerState extends State ); } } - -class MSliderTrackShape extends RoundedRectSliderTrackShape { - @override - Rect getPreferredRect({ - required RenderBox parentBox, - Offset offset = Offset.zero, - SliderThemeData? sliderTheme, - bool isEnabled = false, - bool isDiscrete = false, - }) { - final double trackLeft = offset.dx; - final double trackWidth = parentBox.size.width; - return Rect.fromLTWH(trackLeft, -1, trackWidth, 3); - } -} diff --git a/lib/plugin/pl_player/widgets/bottom_control.dart b/lib/plugin/pl_player/widgets/bottom_control.dart index 8ce278e6..32b98a19 100644 --- a/lib/plugin/pl_player/widgets/bottom_control.dart +++ b/lib/plugin/pl_player/widgets/bottom_control.dart @@ -7,7 +7,9 @@ import 'package:pilipala/plugin/pl_player/widgets/play_pause_btn.dart'; class BottomControl extends StatelessWidget implements PreferredSizeWidget { final PlPlayerController? controller; - const BottomControl({this.controller, Key? key}) : super(key: key); + final Function? triggerFullScreen; + const BottomControl({this.controller, this.triggerFullScreen, Key? key}) + : super(key: key); @override Size get preferredSize => const Size(double.infinity, kToolbarHeight); @@ -136,52 +138,18 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget { // ), // const SizedBox(width: 4), // 全屏 - Obx(() => ComBtn( - icon: Icon( - _.isFullScreen.value - ? FontAwesomeIcons.a - : FontAwesomeIcons.expand, - size: 15, - color: Colors.white, - ), - fuc: () async { - if (!_.isFullScreen.value) { - /// 按照视频宽高比决定全屏方向 - if (_.direction.value == 'horizontal') { - /// 进入全屏 - await enterFullScreen(); - // 横屏 - await landScape(); - } else { - // 竖屏 - await verticalScreen(); - } - - _.toggleFullScreen(true); - var result = await showDialog( - context: Get.context!, - builder: (context) => Dialog.fullscreen( - backgroundColor: Colors.black, - child: PLVideoPlayer( - controller: _, - headerControl: _.headerControl, - ), - ), - ); - if (result == null) { - // 退出全屏 - exitFullScreen(); - await verticalScreen(); - _.toggleFullScreen(false); - } - } else { - Get.back(); - exitFullScreen(); - await verticalScreen(); - _.toggleFullScreen(false); - } - }, - )), + Obx( + () => ComBtn( + icon: Icon( + _.isFullScreen.value + ? FontAwesomeIcons.a + : FontAwesomeIcons.expand, + size: 15, + color: Colors.white, + ), + fuc: () => triggerFullScreen!(), + ), + ), ], ), ],