feat: custom subtitle bg stroke

Closes #90

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-01-03 11:17:57 +08:00
parent 1232116d22
commit 168bb22670
4 changed files with 55 additions and 4 deletions

View File

@@ -148,7 +148,8 @@ class VideoIntroController extends GetxController
Get.find<VideoDetailController>(tag: heroTag); Get.find<VideoDetailController>(tag: heroTag);
if (videoDetailController.videoItem['pic'] == null || if (videoDetailController.videoItem['pic'] == null ||
videoDetailController.videoItem['pic'] == '' || videoDetailController.videoItem['pic'] == '' ||
videoDetailController.videoUrl.isNullOrEmpty) { (videoDetailController.videoUrl.isNullOrEmpty &&
videoDetailController.isQuerying.not)) {
videoDetailController.videoItem['pic'] = result['data'].pic; videoDetailController.videoItem['pic'] = result['data'].pic;
} }
} catch (_) {} } catch (_) {}

View File

@@ -292,7 +292,7 @@ class _HeaderControlState extends State<HeaderControl> {
onTap: () => {Get.back(), showSetDanmaku()}, onTap: () => {Get.back(), showSetDanmaku()},
leading: leading:
const Icon(Icons.subtitles_outlined, size: 20), const Icon(Icons.subtitles_outlined, size: 20),
title: const Text('弹幕设置', style: titleStyle), title: const Text('弹幕/字幕设置', style: titleStyle),
), ),
ListTile( ListTile(
dense: true, dense: true,
@@ -1025,6 +1025,7 @@ class _HeaderControlState extends State<HeaderControl> {
int subtitlePaddingH = widget.controller.subtitlePaddingH; int subtitlePaddingH = widget.controller.subtitlePaddingH;
int subtitlePaddingB = widget.controller.subtitlePaddingB; int subtitlePaddingB = widget.controller.subtitlePaddingB;
double subtitleBgOpaticy = widget.controller.subtitleBgOpaticy; double subtitleBgOpaticy = widget.controller.subtitleBgOpaticy;
double subtitleBgStroke = widget.controller.subtitleBgStroke;
final DanmakuController? danmakuController = final DanmakuController? danmakuController =
widget.controller.danmakuController; widget.controller.danmakuController;
@@ -1058,7 +1059,7 @@ class _HeaderControlState extends State<HeaderControl> {
children: [ children: [
const SizedBox( const SizedBox(
height: 45, height: 45,
child: Center(child: Text('弹幕设置', style: titleStyle)), child: Center(child: Text('弹幕/字幕设置', style: titleStyle)),
), ),
const SizedBox(height: 10), const SizedBox(height: 10),
Row( Row(
@@ -1649,6 +1650,40 @@ class _HeaderControlState extends State<HeaderControl> {
), ),
), ),
), ),
Text('字幕背景边框粗细(背景不透明度为0时启用) $subtitleBgStroke'),
Padding(
padding: const EdgeInsets.only(
top: 0,
bottom: 6,
left: 10,
right: 10,
),
child: SliderTheme(
data: SliderThemeData(
trackShape: MSliderTrackShape(),
thumbColor: Theme.of(context).colorScheme.primary,
activeTrackColor: Theme.of(context).colorScheme.primary,
trackHeight: 10,
thumbShape: const RoundSliderThumbShape(
enabledThumbRadius: 6.0),
),
child: Slider(
min: 0,
max: 3,
divisions: 6,
value: subtitleBgStroke,
label: '$subtitleBgStroke',
onChanged: (double val) {
subtitleBgStroke = val;
widget.controller
..subtitleBgStroke = subtitleBgStroke
..updateSubtitleStyle()
..putDanmakuSettings();
setState(() {});
},
),
),
),
], ],
), ),
), ),

View File

@@ -260,12 +260,18 @@ class PlPlayerController {
late int subtitlePaddingH = GStorage.subtitlePaddingH; late int subtitlePaddingH = GStorage.subtitlePaddingH;
late int subtitlePaddingB = GStorage.subtitlePaddingB; late int subtitlePaddingB = GStorage.subtitlePaddingB;
late double subtitleBgOpaticy = GStorage.subtitleBgOpaticy; late double subtitleBgOpaticy = GStorage.subtitleBgOpaticy;
late double subtitleBgStroke = GStorage.subtitleBgStroke;
// 播放顺序相关 // 播放顺序相关
PlayRepeat playRepeat = PlayRepeat.pause; PlayRepeat playRepeat = PlayRepeat.pause;
final GlobalKey<VideoState> key = GlobalKey<VideoState>(); final GlobalKey<VideoState> key = GlobalKey<VideoState>();
Paint get subtitleBg => Paint()
..style = PaintingStyle.stroke
..strokeWidth = subtitleBgStroke
..color = Colors.black;
TextStyle get subTitleStyle => TextStyle( TextStyle get subTitleStyle => TextStyle(
height: 1.5, height: 1.5,
fontSize: fontSize:
@@ -274,7 +280,11 @@ class PlPlayerController {
wordSpacing: 0.1, wordSpacing: 0.1,
color: Colors.white, color: Colors.white,
fontWeight: FontWeight.normal, fontWeight: FontWeight.normal,
backgroundColor: Colors.black.withOpacity(subtitleBgOpaticy), background:
subtitleBgOpaticy == 0 && subtitleBgStroke != 0 ? subtitleBg : null,
backgroundColor: subtitleBgOpaticy == 0
? null
: Colors.black.withOpacity(subtitleBgOpaticy),
); );
SubtitleViewConfiguration get subtitleViewConfiguration => SubtitleViewConfiguration get subtitleViewConfiguration =>
@@ -1340,6 +1350,7 @@ class PlPlayerController {
setting.put(SettingBoxKey.subtitlePaddingH, subtitlePaddingH); setting.put(SettingBoxKey.subtitlePaddingH, subtitlePaddingH);
setting.put(SettingBoxKey.subtitlePaddingB, subtitlePaddingB); setting.put(SettingBoxKey.subtitlePaddingB, subtitlePaddingB);
setting.put(SettingBoxKey.subtitleBgOpaticy, subtitleBgOpaticy); setting.put(SettingBoxKey.subtitleBgOpaticy, subtitleBgOpaticy);
setting.put(SettingBoxKey.subtitleBgStroke, subtitleBgStroke);
} }
Future<void> dispose({String type = 'single'}) async { Future<void> dispose({String type = 'single'}) async {

View File

@@ -160,6 +160,9 @@ class GStorage {
static double get subtitleBgOpaticy => static double get subtitleBgOpaticy =>
setting.get(SettingBoxKey.subtitleBgOpaticy, defaultValue: 0.67); setting.get(SettingBoxKey.subtitleBgOpaticy, defaultValue: 0.67);
static double get subtitleBgStroke =>
setting.get(SettingBoxKey.subtitleBgStroke, defaultValue: 0.0);
static bool get badCertificateCallback => static bool get badCertificateCallback =>
setting.get(SettingBoxKey.badCertificateCallback, defaultValue: false); setting.get(SettingBoxKey.badCertificateCallback, defaultValue: false);
@@ -369,6 +372,7 @@ class SettingBoxKey {
subtitlePaddingH = 'subtitlePaddingH', subtitlePaddingH = 'subtitlePaddingH',
subtitlePaddingB = 'subtitlePaddingB', subtitlePaddingB = 'subtitlePaddingB',
subtitleBgOpaticy = 'subtitleBgOpaticy', subtitleBgOpaticy = 'subtitleBgOpaticy',
subtitleBgStroke = 'subtitleBgStroke',
badCertificateCallback = 'badCertificateCallback', badCertificateCallback = 'badCertificateCallback',
// Sponsor Block // Sponsor Block