From f50e6d18ddca611056087ac8cd5501be22bc17e6 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 13 Aug 2023 19:40:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=A8=E5=B1=8F=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/setting/play_setting.dart | 37 ++++++++++++++-- .../pl_player/models/fullscreen_mode.dart | 17 ++++++++ lib/plugin/pl_player/view.dart | 43 +++++++++++++++---- lib/utils/storage.dart | 1 + 4 files changed, 87 insertions(+), 11 deletions(-) diff --git a/lib/pages/setting/play_setting.dart b/lib/pages/setting/play_setting.dart index d8fc7413..62f3be55 100644 --- a/lib/pages/setting/play_setting.dart +++ b/lib/pages/setting/play_setting.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/models/video/play/quality.dart'; +import 'package:pilipala/plugin/pl_player/models/fullscreen_mode.dart'; import 'package:pilipala/utils/storage.dart'; import 'widgets/switch_item.dart'; @@ -17,6 +18,7 @@ class _PlaySettingState extends State { late dynamic defaultVideoQa; late dynamic defaultAudioQa; late dynamic defaultDecode; + late int defaultFullScreenMode; @override void initState() { @@ -27,6 +29,8 @@ class _PlaySettingState extends State { defaultValue: AudioQuality.values.last.code); defaultDecode = setting.get(SettingBoxKey.defaultDecode, defaultValue: VideoDecodeFormats.values.last.code); + defaultFullScreenMode = setting.get(SettingBoxKey.fullScreenMode, + defaultValue: FullScreenMode.values.first.code); } @override @@ -68,7 +72,7 @@ class _PlaySettingState extends State { ), trailing: PopupMenuButton( initialValue: defaultVideoQa, - icon: const Icon(Icons.arrow_forward_rounded, size: 22), + icon: const Icon(Icons.more_vert_outlined, size: 22), onSelected: (item) { defaultVideoQa = item; setting.put(SettingBoxKey.defaultVideoQa, item); @@ -93,7 +97,7 @@ class _PlaySettingState extends State { ), trailing: PopupMenuButton( initialValue: defaultAudioQa, - icon: const Icon(Icons.arrow_forward_rounded, size: 22), + icon: const Icon(Icons.more_vert_outlined, size: 22), onSelected: (item) { defaultAudioQa = item; setting.put(SettingBoxKey.defaultAudioQa, item); @@ -119,7 +123,7 @@ class _PlaySettingState extends State { ), trailing: PopupMenuButton( initialValue: defaultDecode, - icon: const Icon(Icons.arrow_forward_rounded, size: 22), + icon: const Icon(Icons.more_vert_outlined, size: 22), onSelected: (item) { defaultDecode = item; setting.put(SettingBoxKey.defaultDecode, item); @@ -135,6 +139,33 @@ class _PlaySettingState extends State { ], ), ), + ListTile( + dense: false, + title: Text('默认全屏方式', style: titleStyle), + subtitle: Text( + '当前全屏方式:' + + FullScreenModeCode.fromCode(defaultFullScreenMode)! + .description, + style: subTitleStyle, + ), + trailing: PopupMenuButton( + initialValue: defaultFullScreenMode, + icon: const Icon(Icons.more_vert_outlined, size: 22), + onSelected: (item) { + defaultFullScreenMode = item; + setting.put(SettingBoxKey.fullScreenMode, item); + setState(() {}); + }, + itemBuilder: (BuildContext context) => [ + for (var i in FullScreenMode.values) ...[ + PopupMenuItem( + value: i.code, + child: Text(i.description), + ), + ] + ], + ), + ), ], ), ); diff --git a/lib/plugin/pl_player/models/fullscreen_mode.dart b/lib/plugin/pl_player/models/fullscreen_mode.dart index 1080b6c6..9b5028e7 100644 --- a/lib/plugin/pl_player/models/fullscreen_mode.dart +++ b/lib/plugin/pl_player/models/fullscreen_mode.dart @@ -7,3 +7,20 @@ enum FullScreenMode { // 始终横屏 horizontal } + +extension FullScreenModeDesc on FullScreenMode { + String get description => ['自适应', '始终竖屏', '始终横屏'][index]; +} + +extension FullScreenModeCode on FullScreenMode { + static final List _codeList = [0, 1, 2]; + int get code => _codeList[index]; + + static FullScreenMode? fromCode(int code) { + final index = _codeList.indexOf(code); + if (index != -1) { + return FullScreenMode.values[index]; + } + return null; + } +} diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 6df96967..e70bec30 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -5,14 +5,17 @@ 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:hive/hive.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; import 'package:pilipala/common/widgets/app_bar_ani.dart'; import 'package:pilipala/plugin/pl_player/controller.dart'; import 'package:pilipala/plugin/pl_player/models/duration.dart'; +import 'package:pilipala/plugin/pl_player/models/fullscreen_mode.dart'; import 'package:pilipala/plugin/pl_player/models/play_status.dart'; import 'package:pilipala/plugin/pl_player/utils.dart'; import 'package:pilipala/utils/feed_back.dart'; +import 'package:pilipala/utils/storage.dart'; import 'package:screen_brightness/screen_brightness.dart'; import 'package:volume_controller/volume_controller.dart'; @@ -62,6 +65,9 @@ class _PLVideoPlayerState extends State bool _volumeInterceptEventStream = false; + Box setting = GStrorage.setting; + late FullScreenMode mode; + void onDoubleTapSeekBackward() { setState(() { _mountSeekBackwardButton = true; @@ -149,16 +155,37 @@ class _PLVideoPlayerState extends State Future triggerFullScreen() async { PlPlayerController _ = widget.controller; + mode = FullScreenModeCode.fromCode( + setting.get(SettingBoxKey.fullScreenMode, defaultValue: 0))!; + if (!_.isFullScreen.value) { /// 按照视频宽高比决定全屏方向 - if (_.direction.value == 'horizontal') { - /// 进入全屏 - await enterFullScreen(); - // 横屏 - // await landScape(); - } else { - // 竖屏 - await verticalScreen(); + switch (mode) { + case FullScreenMode.auto: + if (_.direction.value == 'horizontal') { + /// 进入全屏 + await enterFullScreen(); + // 横屏 + // await landScape(); + } else { + // 竖屏 + await verticalScreen(); + } + break; + case FullScreenMode.vertical: + + /// 进入全屏 + await enterFullScreen(); + // 横屏 + // await landScape(); + break; + case FullScreenMode.horizontal: + + /// 进入全屏 + await enterFullScreen(); + // 横屏 + // await landScape(); + break; } _.toggleFullScreen(true); diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index f1a25f49..e7efc34b 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -79,6 +79,7 @@ class SettingBoxKey { static const String defaultPicQa = 'defaultPicQa'; static const String danmakuEnable = 'danmakuEnable'; + static const String fullScreenMode = 'fullScreenMode'; } class LocalCacheKey {