From 0770f325abe8755206137965db34387880f38962 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sat, 15 Mar 2025 12:36:54 +0800 Subject: [PATCH] feat: subtitle stroke Closes #446 Signed-off-by: bggRGjQaUbCoE --- .../video/detail/widgets/header_control.dart | 36 +++++++++++++++++++ lib/plugin/pl_player/controller.dart | 5 ++- lib/utils/storage.dart | 4 +++ pubspec.lock | 9 ++--- pubspec.yaml | 7 +++- 5 files changed, 55 insertions(+), 6 deletions(-) diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index fe63ab6f..f1ffea3f 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -1042,6 +1042,7 @@ class _HeaderControlState extends State { int subtitlePaddingH = widget.controller.subtitlePaddingH; int subtitlePaddingB = widget.controller.subtitlePaddingB; double subtitleBgOpaticy = widget.controller.subtitleBgOpaticy; + double subtitleStrokeWidth = widget.controller.subtitleStrokeWidth; final sliderTheme = SliderThemeData( trackShape: MSliderTrackShape(), @@ -1057,6 +1058,15 @@ class _HeaderControlState extends State { padding: isFullScreen ? 70 : null, child: StatefulBuilder( builder: (_, setState) { + void updateStrokeWidth(double val) { + subtitleStrokeWidth = val; + widget.controller + ..subtitleStrokeWidth = subtitleStrokeWidth + ..updateSubtitleStyle() + ..putDanmakuSettings(); + setState(() {}); + } + void updateOpacity(double val) { subtitleBgOpaticy = val; widget.controller @@ -1178,6 +1188,32 @@ class _HeaderControlState extends State { ), ), ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('描边粗细 $subtitleStrokeWidth'), + resetBtn(1.5, () => updateStrokeWidth(1.5)), + ], + ), + Padding( + padding: const EdgeInsets.only( + top: 0, + bottom: 6, + left: 10, + right: 10, + ), + child: SliderTheme( + data: sliderTheme, + child: Slider( + min: 0, + max: 3, + value: subtitleStrokeWidth, + divisions: 6, + label: '$subtitleStrokeWidth', + onChanged: updateStrokeWidth, + ), + ), + ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index d3da8e70..e0607acb 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -290,6 +290,7 @@ class PlPlayerController { late int subtitlePaddingB = GStorage.subtitlePaddingB; late double subtitleBgOpaticy = GStorage.subtitleBgOpaticy; late bool showVipDanmaku = GStorage.showVipDanmaku; + late double subtitleStrokeWidth = GStorage.subtitleStrokeWidth; // 播放顺序相关 PlayRepeat playRepeat = PlayRepeat.pause; @@ -313,7 +314,8 @@ class PlPlayerController { right: subtitlePaddingH.toDouble(), bottom: subtitlePaddingB.toDouble(), ), - textScaleFactor: MediaQuery.textScalerOf(Get.context!).scale(1), + textScaleFactor: 1, + strokeWidth: subtitleBgOpaticy == 0 ? subtitleStrokeWidth : null, ); GlobalKey Function()? getPlayerKey; @@ -1533,6 +1535,7 @@ class PlPlayerController { setting.put(SettingBoxKey.subtitlePaddingH, subtitlePaddingH); setting.put(SettingBoxKey.subtitlePaddingB, subtitlePaddingB); setting.put(SettingBoxKey.subtitleBgOpaticy, subtitleBgOpaticy); + setting.put(SettingBoxKey.subtitleStrokeWidth, subtitleStrokeWidth); } Future dispose({String type = 'single'}) async { diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 9f8facb8..1a9e9ee8 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -307,6 +307,9 @@ class GStorage { static double get subtitleBgOpaticy => setting.get(SettingBoxKey.subtitleBgOpaticy, defaultValue: 0.67); + static double get subtitleStrokeWidth => + setting.get(SettingBoxKey.subtitleStrokeWidth, defaultValue: 1.5); + static bool get badCertificateCallback => setting.get(SettingBoxKey.badCertificateCallback, defaultValue: false); @@ -630,6 +633,7 @@ class SettingBoxKey { subtitlePaddingH = 'subtitlePaddingH', subtitlePaddingB = 'subtitlePaddingB', subtitleBgOpaticy = 'subtitleBgOpaticy', + subtitleStrokeWidth = 'subtitleStrokeWidth', badCertificateCallback = 'badCertificateCallback', continuePlayingPart = 'continuePlayingPart', cdnSpeedTest = 'cdnSpeedTest', diff --git a/pubspec.lock b/pubspec.lock index 187dc767..32fbb64b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1210,10 +1210,11 @@ packages: media_kit_video: dependency: "direct main" description: - name: media_kit_video - sha256: "2cc3b966679963ba25a4ce5b771e532a521ebde7c6aa20e9802bec95d9916c8f" - url: "https://pub.dev" - source: hosted + path: media_kit_video + ref: "version_1.2.5" + resolved-ref: cb6fd7e49c30433140001cd19e4e9a8e03c14249 + url: "https://github.com/bggRGjQaUbCoE/media-kit.git" + source: git version: "1.2.5" meta: dependency: transitive diff --git a/pubspec.yaml b/pubspec.yaml index 57210929..9359b2b9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -102,7 +102,12 @@ dependencies: # 视频播放器 media_kit: ^1.1.11 # Primary package. - media_kit_video: ^1.2.5 # For video rendering. + # media_kit_video: ^1.2.5 # For video rendering. + media_kit_video: + git: + url: https://github.com/bggRGjQaUbCoE/media-kit.git + path: media_kit_video + ref: version_1.2.5 media_kit_libs_video: ^1.0.5 # 媒体通知