mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
feat: custom subtitle bg stroke
Closes #90 Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -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 (_) {}
|
||||||
|
|||||||
@@ -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(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user