feat: 全屏手势设置 issues #517

This commit is contained in:
guozhigq
2024-02-28 00:34:46 +08:00
parent 835ea0a9ff
commit 542975d0ec
8 changed files with 133 additions and 10 deletions

View File

@ -0,0 +1,12 @@
enum FullScreenGestureMode {
/// 从上滑到下
fromToptoBottom,
/// 从下滑到上
fromBottomtoTop,
}
extension FullScreenGestureModeExtension on FullScreenGestureMode {
String get values => ['fromToptoBottom', 'fromBottomtoTop'][index];
String get labels => ['从上往下滑进入全屏', '从下往上滑进入全屏'][index];
}

View File

@ -0,0 +1,4 @@
library commonn_model;
export './business_type.dart';
export './gesture_mode.dart';

View File

@ -0,0 +1,88 @@
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:pilipala/utils/global_data.dart';
import '../../../models/common/gesture_mode.dart';
import '../../../utils/storage.dart';
import '../widgets/select_dialog.dart';
import '../widgets/switch_item.dart';
class PlayGesturePage extends StatefulWidget {
const PlayGesturePage({super.key});
@override
State<PlayGesturePage> createState() => _PlayGesturePageState();
}
class _PlayGesturePageState extends State<PlayGesturePage> {
Box setting = GStrorage.setting;
late int fullScreenGestureMode;
@override
void initState() {
super.initState();
fullScreenGestureMode = setting.get(SettingBoxKey.fullScreenGestureMode,
defaultValue: FullScreenGestureMode.values.last.index);
}
@override
Widget build(BuildContext context) {
TextStyle titleStyle = Theme.of(context).textTheme.titleMedium!;
TextStyle subTitleStyle = Theme.of(context)
.textTheme
.labelMedium!
.copyWith(color: Theme.of(context).colorScheme.outline);
return Scaffold(
appBar: AppBar(
centerTitle: false,
titleSpacing: 0,
title: Text(
'手势设置',
style: Theme.of(context).textTheme.titleMedium,
),
),
body: ListView(
children: [
ListTile(
dense: false,
title: Text('全屏手势', style: titleStyle),
subtitle: Text(
'通过手势快速进入全屏',
style: subTitleStyle,
),
onTap: () async {
String? result = await showDialog(
context: context,
builder: (context) {
return SelectDialog<String>(
title: '全屏手势',
value: FullScreenGestureMode
.values[fullScreenGestureMode].values,
values: FullScreenGestureMode.values.map((e) {
return {'title': e.labels, 'value': e.values};
}).toList());
},
);
if (result != null) {
GlobalData().fullScreenGestureMode = FullScreenGestureMode
.values
.firstWhere((element) => element.values == result);
fullScreenGestureMode =
GlobalData().fullScreenGestureMode.index;
setting.put(
SettingBoxKey.fullScreenGestureMode, fullScreenGestureMode);
setState(() {});
}
},
),
const SetSwitchItem(
title: '双击快退/快进',
subTitle: '左侧双击快退,右侧双击快进',
setKey: SettingBoxKey.enableQuickDouble,
defaultVal: true,
),
],
),
);
}
}

View File

@ -73,6 +73,12 @@ class _PlaySettingState extends State<PlaySetting> {
title: Text('倍速设置', style: titleStyle), title: Text('倍速设置', style: titleStyle),
subtitle: Text('设置视频播放速度', style: subTitleStyle), subtitle: Text('设置视频播放速度', style: subTitleStyle),
), ),
ListTile(
dense: false,
onTap: () => Get.toNamed('/playerGestureSet'),
title: Text('手势设置', style: titleStyle),
subtitle: Text('设置播放器手势', style: subTitleStyle),
),
const SetSwitchItem( const SetSwitchItem(
title: '开启1080P', title: '开启1080P',
subTitle: '免登录查看1080P视频', subTitle: '免登录查看1080P视频',
@ -134,12 +140,6 @@ class _PlaySettingState extends State<PlaySetting> {
setKey: SettingBoxKey.enableAutoBrightness, setKey: SettingBoxKey.enableAutoBrightness,
defaultVal: false, defaultVal: false,
), ),
const SetSwitchItem(
title: '双击快退/快进',
subTitle: '左侧双击快退,右侧双击快进',
setKey: SettingBoxKey.enableQuickDouble,
defaultVal: true,
),
const SetSwitchItem( const SetSwitchItem(
title: '弹幕开关', title: '弹幕开关',
subTitle: '展示弹幕', subTitle: '展示弹幕',

View File

@ -9,6 +9,7 @@ import 'package:hive/hive.dart';
import 'package:media_kit/media_kit.dart'; import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart'; import 'package:media_kit_video/media_kit_video.dart';
import 'package:nil/nil.dart'; import 'package:nil/nil.dart';
import 'package:pilipala/models/common/gesture_mode.dart';
import 'package:pilipala/plugin/pl_player/controller.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/duration.dart';
import 'package:pilipala/plugin/pl_player/models/fullscreen_mode.dart'; import 'package:pilipala/plugin/pl_player/models/fullscreen_mode.dart';
@ -17,6 +18,7 @@ import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
import 'package:screen_brightness/screen_brightness.dart'; import 'package:screen_brightness/screen_brightness.dart';
import '../../utils/global_data.dart';
import 'models/bottom_progress_behavior.dart'; import 'models/bottom_progress_behavior.dart';
import 'widgets/app_bar_ani.dart'; import 'widgets/app_bar_ani.dart';
import 'widgets/backward_seek.dart'; import 'widgets/backward_seek.dart';
@ -73,6 +75,8 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
late bool enableQuickDouble; late bool enableQuickDouble;
late bool enableBackgroundPlay; late bool enableBackgroundPlay;
late double screenWidth; late double screenWidth;
final FullScreenGestureMode fullScreenGestureMode =
GlobalData().fullScreenGestureMode;
// 用于记录上一次全屏切换手势触发时间,避免误触 // 用于记录上一次全屏切换手势触发时间,避免误触
DateTime? lastFullScreenToggleTime; DateTime? lastFullScreenToggleTime;
@ -520,18 +524,20 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
// 全屏 // 全屏
final double dy = details.delta.dy; final double dy = details.delta.dy;
const double threshold = 7.0; // 滑动阈值 const double threshold = 7.0; // 滑动阈值
final bool flag =
fullScreenGestureMode != FullScreenGestureMode.values.last;
if (dy > _distance && dy > threshold) { if (dy > _distance && dy > threshold) {
if (_.isFullScreen.value) { if (_.isFullScreen.value ^ flag) {
lastFullScreenToggleTime = DateTime.now(); lastFullScreenToggleTime = DateTime.now();
// 下滑退出全屏 // 下滑退出全屏
await widget.controller.triggerFullScreen(status: false); await widget.controller.triggerFullScreen(status: flag);
} }
_distance = 0.0; _distance = 0.0;
} else if (dy < _distance && dy < -threshold) { } else if (dy < _distance && dy < -threshold) {
if (!_.isFullScreen.value) { if (!_.isFullScreen.value ^ flag) {
lastFullScreenToggleTime = DateTime.now(); lastFullScreenToggleTime = DateTime.now();
// 上滑进入全屏 // 上滑进入全屏
await widget.controller.triggerFullScreen(); await widget.controller.triggerFullScreen(status: !flag);
} }
_distance = 0.0; _distance = 0.0;
} }

View File

@ -39,6 +39,7 @@ import '../pages/setting/pages/color_select.dart';
import '../pages/setting/pages/display_mode.dart'; import '../pages/setting/pages/display_mode.dart';
import '../pages/setting/pages/font_size_select.dart'; import '../pages/setting/pages/font_size_select.dart';
import '../pages/setting/pages/home_tabbar_set.dart'; import '../pages/setting/pages/home_tabbar_set.dart';
import '../pages/setting/pages/play_gesture_set.dart';
import '../pages/setting/pages/play_speed_set.dart'; import '../pages/setting/pages/play_speed_set.dart';
import '../pages/setting/recommend_setting.dart'; import '../pages/setting/recommend_setting.dart';
import '../pages/setting/play_setting.dart'; import '../pages/setting/play_setting.dart';
@ -166,6 +167,9 @@ class Routes {
CustomGetPage(name: '/subscription', page: () => const SubPage()), CustomGetPage(name: '/subscription', page: () => const SubPage()),
// 订阅详情 // 订阅详情
CustomGetPage(name: '/subDetail', page: () => const SubDetailPage()), CustomGetPage(name: '/subDetail', page: () => const SubDetailPage()),
// 播放器手势
CustomGetPage(
name: '/playerGestureSet', page: () => const PlayGesturePage()),
]; ];
} }

View File

@ -1,5 +1,9 @@
import '../models/common/index.dart';
class GlobalData { class GlobalData {
int imgQuality = 10; int imgQuality = 10;
FullScreenGestureMode fullScreenGestureMode =
FullScreenGestureMode.values.last;
// 私有构造函数 // 私有构造函数
GlobalData._(); GlobalData._();

View File

@ -4,6 +4,7 @@ import 'package:path_provider/path_provider.dart';
import 'package:pilipala/models/model_owner.dart'; import 'package:pilipala/models/model_owner.dart';
import 'package:pilipala/models/search/hot.dart'; import 'package:pilipala/models/search/hot.dart';
import 'package:pilipala/models/user/info.dart'; import 'package:pilipala/models/user/info.dart';
import '../models/common/gesture_mode.dart';
import 'global_data.dart'; import 'global_data.dart';
class GStrorage { class GStrorage {
@ -45,6 +46,9 @@ class GStrorage {
video = await Hive.openBox('video'); video = await Hive.openBox('video');
GlobalData().imgQuality = GlobalData().imgQuality =
setting.get(SettingBoxKey.defaultPicQa, defaultValue: 10); // 设置全局变量 setting.get(SettingBoxKey.defaultPicQa, defaultValue: 10); // 设置全局变量
GlobalData().fullScreenGestureMode = FullScreenGestureMode.values[
setting.get(SettingBoxKey.fullScreenGestureMode,
defaultValue: FullScreenGestureMode.values.last.index) as int];
} }
static void regAdapter() { static void regAdapter() {
@ -99,6 +103,7 @@ class SettingBoxKey {
enableQuickDouble = 'enableQuickDouble', enableQuickDouble = 'enableQuickDouble',
enableShowDanmaku = 'enableShowDanmaku', enableShowDanmaku = 'enableShowDanmaku',
enableBackgroundPlay = 'enableBackgroundPlay', enableBackgroundPlay = 'enableBackgroundPlay',
fullScreenGestureMode = 'fullScreenGestureMode',
/// 隐私 /// 隐私
blackMidsList = 'blackMidsList', blackMidsList = 'blackMidsList',