Skip to content

Commit e2d4c43

Browse files
committed
feat: 完善 ios 音轨切换功能
1 parent 07742ae commit e2d4c43

File tree

4 files changed

+78
-8
lines changed

4 files changed

+78
-8
lines changed

lib/l10n/intl_en_us.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const translationsEnUS = {
3333
"alipay": "Alipay",
3434
"playerSkin_tips_playVideoFailed": "Play failed, click retry",
3535
"playerSkin_rate": "Rate",
36+
"playerSkin_audioTrack": "Track",
3637
"videoPlayerScreen_tips_playNext": "Autoplay next",
3738
"tips_logout": "Do you need to logout?",
3839
"logout": "Logout",

lib/l10n/intl_keys.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class Intl {
3333
static const String alipay = "alipay";
3434
static const String playerSkin_tips_playVideoFailed = "playerSkin_tips_playVideoFailed";
3535
static const String playerSkin_rate = "playerSkin_rate";
36+
static const String playerSkin_audioTrack = "playerSkin_audioTrack";
3637
static const String videoPlayerScreen_tips_playNext = "videoPlayerScreen_tips_playNext";
3738
static const String tips_logout = "tips_logout";
3839
static const String logout = "logout";

lib/l10n/intl_zh_cn.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const translationsZhCN = {
3333
"alipay": "支付宝",
3434
"playerSkin_tips_playVideoFailed": "播放失败,点我重试",
3535
"playerSkin_rate": "倍速",
36+
"playerSkin_audioTrack": "音轨",
3637
"videoPlayerScreen_tips_playNext": "将自动播放下一个",
3738
"tips_logout": "您需要退出登录吗?",
3839
"logout": "退出登录",

lib/widget/player_skin.dart

Lines changed: 75 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:async';
2+
import 'dart:convert';
23
import 'dart:io';
34
import 'dart:math';
45

@@ -19,6 +20,7 @@ typedef OnPlayProgressChange = Function(int currentPostion, int duration);
1920
typedef PlayNextCallback = Function();
2021
typedef PlayPreviousCallback = Function();
2122
typedef OnRateMenuTap = Function(Rate);
23+
typedef AudioTrackCheckedCallback = Function(int);
2224

2325
/// Default Panel Widget
2426
class AlistPlayerSkin extends StatefulWidget {
@@ -437,20 +439,31 @@ class AlistPlayerSkinState extends State<AlistPlayerSkin> {
437439

438440
if (_audioTracks != null && _audioTracks!.length > 1)
439441
IconButton(
440-
icon: const Text(
441-
"音轨",
442-
style: TextStyle(color: Colors.white),
442+
icon: Text(
443+
Intl.playerSkin_audioTrack.tr,
444+
style: const TextStyle(color: Colors.white),
443445
),
444446
onPressed: () {
445447
if (_locked) {
446448
return;
447449
}
448450
_hideTimer?.cancel();
449-
var nextAudioTrackIndex =
450-
(_audioTrackIndex + 1) % _audioTracks!.length;
451-
_player.selectTrack(
452-
_audioTracks![nextAudioTrackIndex].trackIndex ?? 0);
453-
_audioTrackIndex = nextAudioTrackIndex;
451+
452+
var dialogTag = "AudioTracSelectorDialog";
453+
SmartDialog.show(
454+
builder: (context) {
455+
return AudioTracSelectorDialog(
456+
audioTracks: _audioTracks!,
457+
index: _audioTrackIndex,
458+
callback: (audioTrackIndex) {
459+
_audioTrackIndex = audioTrackIndex;
460+
_player.selectTrack(
461+
_audioTracks![audioTrackIndex].trackIndex ?? 0);
462+
SmartDialog.dismiss(tag: dialogTag);
463+
},
464+
);
465+
},
466+
tag: dialogTag);
454467
},
455468
),
456469

@@ -1290,3 +1303,57 @@ class HorizontalRateMenuDialog extends StatelessWidget {
12901303
);
12911304
}
12921305
}
1306+
1307+
class AudioTracSelectorDialog extends StatelessWidget {
1308+
const AudioTracSelectorDialog({
1309+
super.key,
1310+
required this.audioTracks,
1311+
required this.index,
1312+
required this.callback,
1313+
});
1314+
1315+
final List<AVPTrackInfo> audioTracks;
1316+
final int index;
1317+
final AudioTrackCheckedCallback callback;
1318+
1319+
@override
1320+
Widget build(BuildContext context) {
1321+
List<Widget> widgets = [];
1322+
for (var i = 0; i < audioTracks.length; i++) {
1323+
Widget widget = GestureDetector(
1324+
onTap: () {
1325+
if (index != i) {
1326+
callback(i);
1327+
}
1328+
},
1329+
child: Padding(
1330+
padding: const EdgeInsets.only(left: 5, right: 20),
1331+
child: Row(
1332+
mainAxisSize: MainAxisSize.min,
1333+
children: [
1334+
Checkbox(
1335+
value: index == i,
1336+
onChanged: (checked) {
1337+
if (checked == true) {
1338+
callback(i);
1339+
}
1340+
}),
1341+
Text("${Intl.playerSkin_audioTrack.tr}:${i + 1}")
1342+
],
1343+
),
1344+
),
1345+
);
1346+
widgets.add(widget);
1347+
}
1348+
return Container(
1349+
decoration: BoxDecoration(
1350+
color: context.theme.colorScheme.background,
1351+
borderRadius: const BorderRadius.all(Radius.circular(10))),
1352+
padding: const EdgeInsets.symmetric(vertical: 10),
1353+
child: Column(
1354+
mainAxisSize: MainAxisSize.min,
1355+
children: widgets,
1356+
),
1357+
);
1358+
}
1359+
}

0 commit comments

Comments
 (0)