feat: musicDetail (#1157)

* feat: musicDetail

* opt: marquee
This commit is contained in:
My-Responsitories
2025-08-28 17:40:12 +08:00
committed by GitHub
parent 84f7f14a29
commit 08a33d9ce5
22 changed files with 1891 additions and 101 deletions

View File

@@ -933,11 +933,25 @@ class _UgcIntroPanelState extends TripleState<UgcIntroPanel>
.map(
(item) => SearchText(
fontSize: 13,
text: item.tagName!,
onTap: (tagName) => Get.toNamed(
'/searchResult',
parameters: {'keyword': tagName},
),
text: switch (item.tagType) {
'bgm' => item.tagName!.replaceFirst('发现', '\u{1f3b5}BGM'),
'topic' => '#${item.tagName}',
_ => item.tagName!,
},
onTap: switch (item.tagType) {
'bgm' => (_) => Get.toNamed(
'/musicDetail',
parameters: {'musicId': item.musicId!},
),
'topic' => (_) => Get.toNamed(
'/dynTopic',
parameters: {'id': item.tagId!.toString()},
),
_ => (tagName) => Get.toNamed(
'/searchResult',
parameters: {'keyword': tagName},
),
},
onLongPress: Utils.copyText,
),
)

View File

@@ -4,6 +4,7 @@ import 'dart:math';
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/marquee.dart';
import 'package:PiliPlus/models/common/super_resolution_type.dart';
import 'package:PiliPlus/models/common/video/audio_quality.dart';
import 'package:PiliPlus/models/common/video/cdn_type.dart';
@@ -42,7 +43,6 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:intl/intl.dart' show DateFormat;
import 'package:marquee/marquee.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:media_kit/media_kit.dart';
import 'package:share_plus/share_plus.dart';
@@ -1960,9 +1960,9 @@ class HeaderControlState extends TripleState<HeaderControl> {
builder: (context, constraints) {
return Obx(
() {
String title;
final videoDetail =
introController.videoDetail.value;
final String title;
if (videoDetail.videos == 1) {
title = videoDetail.title!;
} else {
@@ -1975,59 +1975,14 @@ class HeaderControlState extends TripleState<HeaderControl> {
?.pagePart ??
videoDetail.title!;
}
final textPainter = TextPainter(
text: TextSpan(
text: title,
style: const TextStyle(
color: Colors.white,
fontSize: 16,
),
return MarqueeText(
title,
maxWidth: constraints.maxWidth,
style: const TextStyle(
color: Colors.white,
fontSize: 16,
),
textDirection: TextDirection.ltr,
maxLines: 1,
)..layout(maxWidth: constraints.maxWidth);
if (textPainter.didExceedMaxLines) {
return ConstrainedBox(
constraints: const BoxConstraints(
maxHeight: 25,
),
child: Marquee(
text: title,
style: const TextStyle(
color: Colors.white,
fontSize: 16,
),
scrollAxis: Axis.horizontal,
crossAxisAlignment: CrossAxisAlignment.start,
blankSpace: 200,
velocity: 40,
startAfter: const Duration(seconds: 1),
showFadingOnlyWhenScrolling: true,
fadingEdgeStartFraction: 0,
fadingEdgeEndFraction: 0.1,
numberOfRounds: 1,
startPadding: 0,
accelerationDuration: const Duration(
seconds: 1,
),
accelerationCurve: Curves.linear,
decelerationDuration: const Duration(
milliseconds: 500,
),
decelerationCurve: Curves.easeOut,
),
);
} else {
return Text(
title,
style: const TextStyle(
color: Colors.white,
fontSize: 16,
),
maxLines: 1,
textDirection: TextDirection.ltr,
);
}
);
},
);
},