diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index 770cb28e..090a9a07 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -100,7 +100,8 @@ class _VideoDetailPageVState extends State videoDetailController.plPlayerController.removeSafeArea; bool isShowing = true; - bool get isFullScreen => plPlayerController?.isFullScreen.value ?? false; + bool get isFullScreen => + videoDetailController.plPlayerController.isFullScreen.value; bool get _shouldShowSeasonPanel { if (isPortrait || !videoDetailController.isUgc) { @@ -1110,9 +1111,10 @@ class _VideoDetailPageVState extends State width = min(width, maxWidth - 280); } final videoWidth = isFullScreen ? maxWidth : width; - final double videoHeight = isFullScreen ? maxHeight : width * 9 / 16; + final double height = width * 9 / 16; + final videoHeight = isFullScreen ? maxHeight : height; final introHeight = - maxHeight - videoHeight - (removeSafeArea ? 0 : padding.top); + maxHeight - height - (removeSafeArea ? 0 : padding.top); return Row( children: [ Column( @@ -1404,6 +1406,7 @@ class _VideoDetailPageVState extends State : pgcIntroController, headerControl: HeaderControl( key: videoDetailController.headerCtrKey, + isPortrait: isPortrait, controller: videoDetailController.plPlayerController, videoDetailCtr: videoDetailController, heroTag: heroTag, diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index b500a587..105a1272 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -49,11 +49,13 @@ import 'package:share_plus/share_plus.dart'; class HeaderControl extends StatefulWidget { const HeaderControl({ + required this.isPortrait, required this.controller, required this.videoDetailCtr, required this.heroTag, super.key, }); + final bool isPortrait; final PlPlayerController controller; final VideoDetailController videoDetailCtr; final String heroTag; @@ -75,7 +77,8 @@ class HeaderControlState extends TripleState { late CommonIntroController introController = videoDetailCtr.isUgc ? ugcIntroController : pgcIntroController; - bool get horizontalScreen => videoDetailCtr.horizontalScreen; + late final isPortrait = widget.isPortrait; + late final horizontalScreen = videoDetailCtr.horizontalScreen; RxString now = ''.obs; Timer? clock; bool get isFullScreen => widget.controller.isFullScreen.value; @@ -1346,7 +1349,7 @@ class HeaderControlState extends TripleState { ..danmakuFontScaleFS = fontSizeFS ..putDanmakuSettings(); setState(() {}); - if (widget.controller.isFullScreen.value == true) { + if (isFullScreen) { try { danmakuController?.updateOption( danmakuController.option.copyWith( @@ -1363,7 +1366,7 @@ class HeaderControlState extends TripleState { ..danmakuFontScale = fontSize ..putDanmakuSettings(); setState(() {}); - if (widget.controller.isFullScreen.value == false) { + if (!isFullScreen) { try { danmakuController?.updateOption( danmakuController.option.copyWith( @@ -1878,7 +1881,7 @@ class HeaderControlState extends TripleState { onPressed: () { if (isFullScreen) { widget.controller.triggerFullScreen(status: false); - } else if (!horizontalScreen && context.isLandscape) { + } else if (!horizontalScreen && !isPortrait) { verticalScreenForTwoSeconds(); } else { Get.back(); @@ -1886,7 +1889,7 @@ class HeaderControlState extends TripleState { }, ), ), - if (!isFullScreen || context.isLandscape) + if (!isFullScreen || !isPortrait) SizedBox( width: 42, height: 34, @@ -1904,10 +1907,7 @@ class HeaderControlState extends TripleState { ), ), if ((introController.videoDetail.value.title != null) && - (isFullScreen || - (!isFullScreen && - !horizontalScreen && - context.isLandscape))) + (isFullScreen || (!horizontalScreen && !isPortrait))) Expanded( child: Column( mainAxisSize: MainAxisSize.min, @@ -2007,8 +2007,7 @@ class HeaderControlState extends TripleState { // show current datetime Obx( () { - if ((isFullScreen || !horizontalScreen) && - context.isLandscape) { + if ((isFullScreen || !horizontalScreen) && !isPortrait) { startClock(); return Text( now.value, diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 2fdb0489..830c2c8b 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -25,7 +25,6 @@ import 'package:PiliPlus/plugin/pl_player/widgets/bottom_control.dart'; import 'package:PiliPlus/plugin/pl_player/widgets/common_btn.dart'; import 'package:PiliPlus/plugin/pl_player/widgets/forward_seek.dart'; import 'package:PiliPlus/plugin/pl_player/widgets/play_pause_btn.dart'; -import 'package:PiliPlus/utils/context_ext.dart'; import 'package:PiliPlus/utils/duration_util.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/id_utils.dart'; @@ -248,7 +247,7 @@ class _PLVideoPlayerState extends State } // 动态构建底部控制条 - Widget buildBottomControl(double maxWidth) { + Widget buildBottomControl(bool isLandscape) { final videoDetail = introController.videoDetail.value; final isSeason = videoDetail.ugcSeason != null; final isPart = videoDetail.pages != null && videoDetail.pages!.length > 1; @@ -256,7 +255,7 @@ class _PLVideoPlayerState extends State final isPlayAll = widget.videoDetailController?.isPlayAll == true; final anySeason = isSeason || isPart || isPgc || isPlayAll; - final double widgetWidth = isFullScreen && context.isLandscape ? 42 : 35; + final double widgetWidth = isLandscape && isFullScreen ? 42 : 35; Widget progressWidget( BottomControlType bottomControl, @@ -379,44 +378,41 @@ class _PLVideoPlayerState extends State ), /// 超分辨率 - BottomControlType.superResolution => - plPlayerController.isAnim - ? Container( - height: 30, - margin: const EdgeInsets.symmetric(horizontal: 10), - alignment: Alignment.center, - child: PopupMenuButton( - initialValue: SuperResolutionType - .values[plPlayerController.superResolutionType], - color: Colors.black.withValues(alpha: 0.8), - itemBuilder: (BuildContext context) { - return SuperResolutionType.values.map(( - SuperResolutionType type, - ) { - return PopupMenuItem( - height: 35, - padding: const EdgeInsets.only(left: 30), - value: type, - onTap: () => plPlayerController.setShader(type.index), - child: Text( - type.title, - style: const TextStyle( - color: Colors.white, - fontSize: 13, - ), - ), - ); - }).toList(); - }, - child: Text( - SuperResolutionType - .values[plPlayerController.superResolutionType] - .title, - style: const TextStyle(color: Colors.white, fontSize: 13), + BottomControlType.superResolution => Container( + height: 30, + margin: const EdgeInsets.symmetric(horizontal: 10), + alignment: Alignment.center, + child: PopupMenuButton( + initialValue: SuperResolutionType + .values[plPlayerController.superResolutionType], + color: Colors.black.withValues(alpha: 0.8), + itemBuilder: (BuildContext context) { + return SuperResolutionType.values.map(( + SuperResolutionType type, + ) { + return PopupMenuItem( + height: 35, + padding: const EdgeInsets.only(left: 30), + value: type, + onTap: () => plPlayerController.setShader(type.index), + child: Text( + type.title, + style: const TextStyle( + color: Colors.white, + fontSize: 13, ), ), - ) - : const SizedBox.shrink(), + ); + }).toList(); + }, + child: Text( + SuperResolutionType + .values[plPlayerController.superResolutionType] + .title, + style: const TextStyle(color: Colors.white, fontSize: 13), + ), + ), + ), /// 分段信息 BottomControlType.viewPoints => Obx( @@ -650,7 +646,7 @@ class _PLVideoPlayerState extends State List userSpecifyItemRight = [ BottomControlType.dmChart, - BottomControlType.superResolution, + if (plPlayerController.isAnim) BottomControlType.superResolution, BottomControlType.viewPoints, if (anySeason) BottomControlType.episode, if (isFullScreen) BottomControlType.fit, @@ -663,12 +659,14 @@ class _PLVideoPlayerState extends State children: [ ...userSpecifyItemLeft.map(progressWidget), Expanded( - child: FittedBox( - child: ConstrainedBox( - constraints: BoxConstraints(minWidth: maxWidth), - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: userSpecifyItemRight.map(progressWidget).toList(), + child: LayoutBuilder( + builder: (context, constraints) => FittedBox( + child: ConstrainedBox( + constraints: BoxConstraints(minWidth: constraints.maxWidth), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: userSpecifyItemRight.map(progressWidget).toList(), + ), ), ), ), @@ -1294,7 +1292,8 @@ class _PLVideoPlayerState extends State widget.bottomControl ?? BottomControl( controller: plPlayerController, - buildBottomControl: buildBottomControl, + buildBottomControl: () => + buildBottomControl(maxWidth > maxHeight), maxWidth: maxWidth, ), ), diff --git a/lib/plugin/pl_player/widgets/bottom_control.dart b/lib/plugin/pl_player/widgets/bottom_control.dart index 95c42f79..aef3996a 100644 --- a/lib/plugin/pl_player/widgets/bottom_control.dart +++ b/lib/plugin/pl_player/widgets/bottom_control.dart @@ -18,7 +18,7 @@ class BottomControl extends StatelessWidget { }); final PlPlayerController controller; - final Widget Function(double maxWidth) buildBottomControl; + final Widget Function() buildBottomControl; final double maxWidth; @override @@ -157,7 +157,7 @@ class BottomControl extends StatelessWidget { ); }, ), - buildBottomControl(maxWidth), + buildBottomControl(), const SizedBox(height: 12), ], ),