diff --git a/lib/pages/setting/widgets/model.dart b/lib/pages/setting/widgets/model.dart index 943a5aeb4..f45317eaf 100644 --- a/lib/pages/setting/widgets/model.dart +++ b/lib/pages/setting/widgets/model.dart @@ -774,13 +774,30 @@ List get playSettings => [ ), _getVideoFilterSelectModel( context: Get.context!, - title: '快进/快退时长', + title: '双击快进/快退时长', suffix: 's', key: SettingBoxKey.fastForBackwardDuration, values: [5, 10, 15], defaultValue: 10, isFilter: false, ), + SettingsModel( + settingsType: SettingsType.sw1tch, + title: '滑动快进/快退使用相对时长', + leading: const Icon(Icons.swap_horiz_outlined), + setKey: SettingBoxKey.useRelativeSlide, + defaultVal: false, + ), + _getVideoFilterSelectModel( + context: Get.context!, + title: '滑动快进/快退时长', + subtitle: '从播放器一端滑到另一端的快进/快退时长', + suffix: GStorage.useRelativeSlide ? '%' : 's', + key: SettingBoxKey.sliderDuration, + values: [25, 50, 90, 100], + defaultValue: 90, + isFilter: false, + ), SettingsModel( settingsType: SettingsType.normal, title: '自动启用字幕', @@ -2512,6 +2529,7 @@ SettingsModel _getBanwordModel( SettingsModel _getVideoFilterSelectModel({ required BuildContext context, required String title, + String? subtitle, String? suffix, required String key, required List values, @@ -2523,9 +2541,12 @@ SettingsModel _getVideoFilterSelectModel({ settingsType: SettingsType.normal, title: '$title${isFilter ? '过滤' : ''}', leading: const Icon(Icons.timelapse_outlined), - getSubtitle: () => isFilter - ? '过滤掉$title小于「$value${suffix ?? ""}」的视频' - : '当前$title:「$value${suffix ?? ""}」', + subtitle: subtitle, + getSubtitle: subtitle == null + ? () => isFilter + ? '过滤掉$title小于「$value${suffix ?? ""}」的视频' + : '当前$title:「$value${suffix ?? ""}」' + : null, onTap: (setState) async { var result = await showDialog( context: context, diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 4f0bb3988..0f859f274 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -110,6 +110,15 @@ class _PLVideoPlayerState extends State late final RxBool showRestoreScaleBtn = false.obs; + late final _isRelative = GStorage.useRelativeSlide; + late final _offset = _isRelative + ? GStorage.sliderDuration / 100 + : GStorage.sliderDuration * 1000; + + num get sliderScale => _isRelative + ? plPlayerController.duration.value.inMilliseconds * _offset + : _offset; + Offset _initialFocalPoint = Offset.zero; String? _gestureType; //播放器放缩 @@ -820,18 +829,16 @@ class _PLVideoPlayerState extends State final int curSliderPosition = plPlayerController.sliderPosition.value.inMilliseconds; - final double scale = 90000 / renderBox.size.width; + final double width = renderBox.size.width; final Duration pos = Duration( - milliseconds: - curSliderPosition + (delta.dx * scale).round()); + milliseconds: curSliderPosition + + (sliderScale * delta.dx / width).round()); // TODO final Duration result = pos.clamp(Duration.zero, plPlayerController.duration.value); final height = renderBox.size.height * 0.125; if (details.localFocalPoint.dy <= height && - (details.localFocalPoint.dx >= - renderBox.size.width * 0.875 || - details.localFocalPoint.dx <= - renderBox.size.width * 0.125)) { + (details.localFocalPoint.dx >= width * 0.875 || + details.localFocalPoint.dx <= width * 0.125)) { plPlayerController.cancelSeek = true; plPlayerController.showPreview.value = false; if (plPlayerController.hasToast != true) { diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 82a0ac401..7143c67a8 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -145,6 +145,12 @@ class GStorage { setting.get(SettingBoxKey.subtitlePreference, defaultValue: SubtitlePreference.values.first.code); + static bool get useRelativeSlide => + setting.get(SettingBoxKey.useRelativeSlide, defaultValue: false); + + static int get sliderDuration => + setting.get(SettingBoxKey.sliderDuration, defaultValue: 90); + static int get defaultVideoQa => setting.get( SettingBoxKey.defaultVideoQa, defaultValue: VideoQuality.values.last.code, @@ -639,6 +645,8 @@ class SettingBoxKey { pipNoDanmaku = 'pipNoDanmaku', enableAutoLongPressSpeed = 'enableAutoLongPressSpeed', subtitlePreference = 'subtitlePreference', + useRelativeSlide = 'useRelativeSlide', + sliderDuration = 'sliderOffset', // youtube 双击快进快退 enableQuickDouble = 'enableQuickDouble',