diff --git a/lib/common/widgets/image_viewer/image.dart b/lib/common/widgets/image_viewer/image.dart index 21f54677a..8dbba0d29 100644 --- a/lib/common/widgets/image_viewer/image.dart +++ b/lib/common/widgets/image_viewer/image.dart @@ -9,7 +9,7 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image_viewer/viewer.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; +import 'package:flutter/gestures.dart' show DoubleTapGestureRecognizer; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/semantics.dart'; diff --git a/lib/common/widgets/image_viewer/viewer.dart b/lib/common/widgets/image_viewer/viewer.dart index 823664585..4b97274e8 100644 --- a/lib/common/widgets/image_viewer/viewer.dart +++ b/lib/common/widgets/image_viewer/viewer.dart @@ -431,7 +431,7 @@ class _ViewerState extends State with SingleTickerProviderStateMixin { if (initialPosition == null) { return true; } - if (_scale <= 1.0) { + if (_scale <= widget.minScale) { return true; } final containerWidth = widget.containerSize.width; @@ -442,9 +442,9 @@ class _ViewerState extends State with SingleTickerProviderStateMixin { final dx = (1 - _scale) * containerWidth / 2; final dxOffset = (imageWidth - containerWidth) / 2; if (initialPosition.dx < lastPosition.global.dx) { - return _position.dx.equals(dx + dxOffset); + return _position.dx.equals(dx + dxOffset, 1e-6); } else { - return _position.dx.equals(dx - dxOffset); + return _position.dx.equals(dx - dxOffset, 1e-6); } } diff --git a/lib/common/widgets/scroll_physics.dart b/lib/common/widgets/scroll_physics.dart index 4b63ff38f..e241fa8d1 100644 --- a/lib/common/widgets/scroll_physics.dart +++ b/lib/common/widgets/scroll_physics.dart @@ -3,22 +3,12 @@ import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recogniz import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:flutter/material.dart' hide TabBarView; -Widget videoTabBarView({ - required List children, - TabController? controller, -}) => TabBarView( - controller: controller, - physics: const CustomTabBarViewScrollPhysics(parent: ClampingScrollPhysics()), - horizontalDragGestureRecognizer: CustomHorizontalDragGestureRecognizer.new, - children: children, -); - Widget tabBarView({ required List children, TabController? controller, }) => TabBarView( - physics: const CustomTabBarViewScrollPhysics(), controller: controller, + physics: clampingScrollPhysics, horizontalDragGestureRecognizer: CustomHorizontalDragGestureRecognizer.new, children: children, ); @@ -32,6 +22,10 @@ SpringDescription _customSpringDescription() { ); } +const clampingScrollPhysics = CustomTabBarViewScrollPhysics( + parent: ClampingScrollPhysics(), +); + class CustomTabBarViewScrollPhysics extends ScrollPhysics { const CustomTabBarViewScrollPhysics({super.parent}); diff --git a/lib/pages/article/view.dart b/lib/pages/article/view.dart index 571f292e2..b4f90cf09 100644 --- a/lib/pages/article/view.dart +++ b/lib/pages/article/view.dart @@ -257,9 +257,7 @@ class _ArticlePageState extends CommonDynPageState { width: maxWidth, margin: const EdgeInsets.only(bottom: 10), child: PageView.builder( - physics: const CustomTabBarViewScrollPhysics( - parent: ClampingScrollPhysics(), - ), + physics: clampingScrollPhysics, onPageChanged: (value) => controller.topIndex.value = value, itemCount: length, diff --git a/lib/pages/dynamics/view.dart b/lib/pages/dynamics/view.dart index 2efa73ec9..6ea0c96fd 100644 --- a/lib/pages/dynamics/view.dart +++ b/lib/pages/dynamics/view.dart @@ -127,7 +127,7 @@ class _DynamicsPageState extends CommonPageState Widget? leading; List? actions; - Widget child = videoTabBarView( + Widget child = tabBarView( controller: _dynamicsController.tabController, children: DynamicsTabType.values .map((e) => DynamicsTabPage(dynamicsType: e)) diff --git a/lib/pages/episode_panel/view.dart b/lib/pages/episode_panel/view.dart index 9eed0dfc3..2ae1072a3 100644 --- a/lib/pages/episode_panel/view.dart +++ b/lib/pages/episode_panel/view.dart @@ -7,6 +7,7 @@ import 'package:PiliPlus/common/widgets/flutter/page/tabs.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart'; +import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart'; import 'package:PiliPlus/http/fav.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -235,6 +236,7 @@ class _EpisodePanelState extends State if (_isMulti) { return TabBarView( controller: _tabController, + physics: clampingScrollPhysics, horizontalDragGestureRecognizer: () => TabBarDragGestureRecognizer(isDxAllowed: isDxAllowed), children: List.generate( diff --git a/lib/pages/history/view.dart b/lib/pages/history/view.dart index 2cca7d8a6..610998d02 100644 --- a/lib/pages/history/view.dart +++ b/lib/pages/history/view.dart @@ -136,7 +136,7 @@ class _HistoryPageState extends State child: TabBarView( physics: enableMultiSelect ? const NeverScrollableScrollPhysics() - : const CustomTabBarViewScrollPhysics(), + : clampingScrollPhysics, controller: _historyController.tabController, horizontalDragGestureRecognizer: CustomHorizontalDragGestureRecognizer.new, diff --git a/lib/pages/later/view.dart b/lib/pages/later/view.dart index b425533fb..c38eeadd9 100644 --- a/lib/pages/later/view.dart +++ b/lib/pages/later/view.dart @@ -132,7 +132,7 @@ class _LaterPageState extends State child: TabBarView( physics: enableMultiSelect ? const NeverScrollableScrollPhysics() - : const CustomTabBarViewScrollPhysics(), + : clampingScrollPhysics, controller: _tabController, horizontalDragGestureRecognizer: CustomHorizontalDragGestureRecognizer.new, diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 20d203c87..5e3027694 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -727,9 +727,7 @@ class _LiveRoomPageState extends State ? PageView( key: pageKey, controller: _liveRoomController.pageController, - physics: const CustomTabBarViewScrollPhysics( - parent: ClampingScrollPhysics(), - ), + physics: clampingScrollPhysics, onPageChanged: (value) => _liveRoomController.pageIndex.value = value, horizontalDragGestureRecognizer: diff --git a/lib/pages/video/introduction/pgc/widgets/intro_detail.dart b/lib/pages/video/introduction/pgc/widgets/intro_detail.dart index 33cf3ae2f..f29309597 100644 --- a/lib/pages/video/introduction/pgc/widgets/intro_detail.dart +++ b/lib/pages/video/introduction/pgc/widgets/intro_detail.dart @@ -96,7 +96,7 @@ class _IntroDetailState extends State Widget buildList(ThemeData theme) { return TabBarView( controller: _tabController, - physics: const CustomTabBarViewScrollPhysics(), + physics: clampingScrollPhysics, horizontalDragGestureRecognizer: () => TabBarDragGestureRecognizer(isDxAllowed: isDxAllowed), children: [ diff --git a/lib/pages/video/pay_coins/view.dart b/lib/pages/video/pay_coins/view.dart index 5317dd123..5c79c06dc 100644 --- a/lib/pages/video/pay_coins/view.dart +++ b/lib/pages/video/pay_coins/view.dart @@ -335,9 +335,7 @@ class _PayCoinsPageState extends State height: 100, child: PageView( key: const PageStorageKey(_PayCoinsPageState), - physics: const CustomTabBarViewScrollPhysics( - parent: ClampingScrollPhysics(), - ), + physics: clampingScrollPhysics, controller: _controller, onPageChanged: (index) { _scale(); diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index 610136ea5..f8e1ae209 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -863,7 +863,7 @@ class _VideoDetailPageVState extends State children: [ buildTabBar(onTap: videoDetailController.animToTop), Expanded( - child: videoTabBarView( + child: tabBarView( controller: videoDetailController.tabCtr, children: [ videoIntro( @@ -932,7 +932,7 @@ class _VideoDetailPageVState extends State children: [ buildTabBar(), Expanded( - child: videoTabBarView( + child: tabBarView( controller: videoDetailController.tabCtr, children: [ videoIntro( @@ -1000,7 +1000,7 @@ class _VideoDetailPageVState extends State children: [ buildTabBar(showIntro: false), Expanded( - child: videoTabBarView( + child: tabBarView( controller: videoDetailController.tabCtr, children: [ if (videoDetailController.showReply) @@ -1080,7 +1080,7 @@ class _VideoDetailPageVState extends State : showIntro, ), Expanded( - child: videoTabBarView( + child: tabBarView( controller: videoDetailController.tabCtr, children: [ if (videoDetailController.isFileSource) diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 4b82de3ac..1f4a5494e 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -419,9 +419,9 @@ class PlPlayerController with BlockConfigMixin { : Colors.black.withValues(alpha: subtitleBgOpacity), ); - late final Rx subtitleConfig = _getSubConfig.obs; + late final Rx subtitleConfig = getSubConfig.obs; - SubtitleViewConfiguration get _getSubConfig { + SubtitleViewConfiguration get getSubConfig { final subTitleStyle = this.subTitleStyle; return SubtitleViewConfiguration( style: subTitleStyle, @@ -446,7 +446,7 @@ class PlPlayerController with BlockConfigMixin { } void updateSubtitleStyle() { - subtitleConfig.value = _getSubConfig; + subtitleConfig.value = getSubConfig; } void onUpdatePadding(EdgeInsets padding) { diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 02f3d6dc5..3085bf50b 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -152,40 +152,66 @@ class _PLVideoPlayerState extends State // Timer? _accessibilityDebounce; // double _lastAnnouncedValue = -1; - StreamSubscription? _listener; - StreamSubscription? _controlsListener; - bool _pauseDueToPauseUponEnteringBackgroundMode = false; + StreamSubscription? _brightnessListener; + + int? tmpSubtitlePaddingB; + StreamSubscription? _controlsListener; + void _controlListener(bool val) { + final visible = val && !plPlayerController.controlsLock.value; + + if ((widget.headerControl.key as GlobalKey).currentState + case final state?) { + if (state.mounted) { + state.getBatteryLevelIfNeeded(); + state.provider + ?..startIfNeeded() + ..muted = !visible; + if (visible) { + state.startClock(); + } else { + state.stopClock(); + } + } + } + + if (visible) { + animationController.forward(); + } else { + animationController.reverse(); + } + + if (widget.videoDetailController case final controller?) { + if (controller.vttSubtitlesIndex.value != 0) { + if (visible) { + const int minPadding = 70; + if (plPlayerController.subtitlePaddingB < minPadding) { + tmpSubtitlePaddingB = plPlayerController.subtitlePaddingB; + plPlayerController + ..subtitlePaddingB = minPadding + ..subtitleConfig.value = plPlayerController.getSubConfig; + } + } else { + if (tmpSubtitlePaddingB != null) { + plPlayerController + ..subtitlePaddingB = tmpSubtitlePaddingB! + ..subtitleConfig.value = plPlayerController.getSubConfig; + tmpSubtitlePaddingB = null; + } + } + } + } + } + @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); - _controlsListener = plPlayerController.showControls.listen((bool val) { - final visible = val && !plPlayerController.controlsLock.value; - - if ((widget.headerControl.key as GlobalKey).currentState - case final state?) { - if (state.mounted) { - state.getBatteryLevelIfNeeded(); - state.provider - ?..startIfNeeded() - ..muted = !visible; - if (visible) { - state.startClock(); - } else { - state.stopClock(); - } - } - } - - if (visible) { - animationController.forward(); - } else { - animationController.reverse(); - } - }); + _controlsListener = plPlayerController.showControls.listen( + _controlListener, + ); transformationController = TransformationController(); animationController = AnimationController( vsync: this, @@ -229,7 +255,8 @@ class _PLVideoPlayerState extends State } } - _listener = Platform.isIOS || plPlayerController.setSystemBrightness + _brightnessListener = + Platform.isIOS || plPlayerController.setSystemBrightness ? ScreenBrightnessPlatform .instance .onSystemScreenBrightnessChanged @@ -313,7 +340,7 @@ class _PLVideoPlayerState extends State _tapGestureRecognizer.dispose(); _longPressRecognizer?.dispose(); _doubleTapGestureRecognizer.dispose(); - _listener?.cancel(); + _brightnessListener?.cancel(); _controlsListener?.cancel(); animationController.dispose(); if (PlatformUtils.isMobile) {