Browse Source

修改点击文字播放

weicu
tanlongsheng 1 year ago
parent
commit
051ea80398
  1. 7
      lib/modules/meeting/controllers/meeting_details_controller.dart
  2. 123
      lib/modules/meeting/views/meeting_details_view.dart
  3. 52
      lib/modules/meeting/views/speech_tab.dart

7
lib/modules/meeting/controllers/meeting_details_controller.dart

@ -25,7 +25,9 @@ class MeetingDetailsController extends GetxController
final PlayerController playerController = PlayerController(); final PlayerController playerController = PlayerController();
RxBool isTop = false.obs; RxBool isTop = false.obs;
RxInt durationMax = 0.obs; RxInt durationMax = 0.obs;
RxDouble dragOffset = 210.0.w.obs; RxDouble dragOffset = 210.w.obs;
RxInt currentDuration = 0.obs;
int id = 0; int id = 0;
@ -99,6 +101,9 @@ class MeetingDetailsController extends GetxController
); );
durationMax.value = await playerController.getDuration(DurationType.max); durationMax.value = await playerController.getDuration(DurationType.max);
playerController.setFinishMode(finishMode: FinishMode.pause); playerController.setFinishMode(finishMode: FinishMode.pause);
playerController.onCurrentDurationChanged.listen((int position) {
currentDuration.value = position;
});
if (meetingDetails.value.tasktype == 1) { if (meetingDetails.value.tasktype == 1) {
List speakerList = await SqfliteApi.getMeetingSpeaker(id); List speakerList = await SqfliteApi.getMeetingSpeaker(id);
textList.value = List.from(speakerList); textList.value = List.from(speakerList);

123
lib/modules/meeting/views/meeting_details_view.dart

@ -92,14 +92,22 @@ class MeetingDetailsView extends GetView<MeetingDetailsController> {
}, },
), ),
4.horizontalSpace, 4.horizontalSpace,
AudioFileWaveforms( GestureDetector(
size: Size(130.w, 30.w), onTap: () {
playerController: controller.playerController, if (controller.isSpeakerText.value) return;
playerWaveStyle: PlayerWaveStyle( controller.dragOffset.value = 210.w;
fixedWaveColor: Colors.grey[400]!, controller.isTop.value = false;
liveWaveColor: Colors.red, },
seekLineColor: Colors.red, child: AudioFileWaveforms(
scaleFactor: 100, size: Size(130.w, 30.w),
playerController: controller.playerController,
enableSeekGesture: false,
playerWaveStyle: PlayerWaveStyle(
fixedWaveColor: Colors.grey[400]!,
liveWaveColor: Colors.red,
seekLineColor: Colors.red,
scaleFactor: 100,
),
), ),
), ),
], ],
@ -203,19 +211,23 @@ class MeetingDetailsView extends GetView<MeetingDetailsController> {
child: Column( child: Column(
children: [ children: [
_soundWave(isDarkMode), _soundWave(isDarkMode),
Container( Obx(
padding: EdgeInsets.symmetric(horizontal: 8.w), () => !controller.isSpeakerText.value
margin: EdgeInsets.symmetric(vertical: 10.w), ? Container(
child: Obx( padding: EdgeInsets.symmetric(horizontal: 8.w),
() => Row( margin: EdgeInsets.symmetric(vertical: 10.w),
children: [ child: Obx(
_iconItem(Icons.summarize, '概述', 0), () => Row(
_iconItem(Icons.message, '转写', 1), children: [
_iconItem(Icons.article, '总结', 2), _iconItem(Icons.summarize, '概述', 0),
_iconItem(Icons.lan, '思维导图', 3), _iconItem(Icons.message, '转写', 1),
], _iconItem(Icons.article, '总结', 2),
), _iconItem(Icons.lan, '思维导图', 3),
), ],
),
),
)
: const SizedBox(),
), ),
], ],
), ),
@ -289,25 +301,20 @@ class MeetingDetailsView extends GetView<MeetingDetailsController> {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
StreamBuilder<int>( Obx(
stream: controller () => Text(
.playerController.onCurrentDurationChanged, DateUtil.formatDateMs(
builder: (context, snapshot) { controller.currentDuration.value,
final position = snapshot.data ?? 0; format: 'HH:mm:ss',
return Text( isUtc: true,
DateUtil.formatDateMs( ),
position, style: TextStyle(
format: 'HH:mm:ss', color: isDarkMode
isUtc: true, ? Colors.grey[400]
), : Colors.grey[500],
style: TextStyle( fontSize: 12.sp,
color: isDarkMode ),
? Colors.grey[400] ),
: Colors.grey[500],
fontSize: 12.sp,
),
);
},
), ),
Obx( Obx(
() => Text( () => Text(
@ -330,10 +337,20 @@ class MeetingDetailsView extends GetView<MeetingDetailsController> {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
Icon( GestureDetector(
Icons.replay_10, onTap: () {
color: Colors.black, int progress =
size: 30.w, controller.currentDuration.value - 10000;
if (progress < 0) {
progress = 0;
}
controller.playerController.seekTo(progress);
},
child: Icon(
Icons.replay_10,
color: Colors.black,
size: 30.w,
),
), ),
StreamBuilder<PlayerState>( StreamBuilder<PlayerState>(
stream: stream:
@ -356,10 +373,17 @@ class MeetingDetailsView extends GetView<MeetingDetailsController> {
); );
}, },
), ),
Icon( GestureDetector(
Icons.forward_10, onTap: () {
color: Colors.black, int progress =
size: 30.w, controller.currentDuration.value + 10000;
controller.playerController.seekTo(progress);
},
child: Icon(
Icons.forward_10,
color: Colors.black,
size: 30.w,
),
), ),
], ],
), ),
@ -382,9 +406,6 @@ class MeetingDetailsView extends GetView<MeetingDetailsController> {
onTap: () { onTap: () {
if (isActive) return; if (isActive) return;
controller.tabController.index = index; controller.tabController.index = index;
controller.isSpeakerText.value = false;
controller.editSpeakerTextId.value = 0;
controller.editSpeakerTextList = [];
}, },
child: Container( child: Container(
height: 45.w, height: 45.w,

52
lib/modules/meeting/views/speech_tab.dart

@ -151,16 +151,46 @@ class SpeechTab extends GetView<MeetingDetailsController> {
), ),
); );
} else { } else {
return Container( return Obx(() {
padding: EdgeInsets.symmetric( bool isActive = false;
horizontal: 14.w, int starttime = item['starttime'];
vertical: 5.w, int endtime = 0;
), if (index == controller.textList.length - 1) {
child: Text( endtime = controller.durationMax.value;
item['content'], } else {
style: textStyle, endtime = controller.textList[index + 1]['starttime'];
), }
); if (controller.currentDuration.value != 0) {
if (controller.currentDuration.value >= starttime &&
controller.currentDuration.value <= endtime) {
isActive = true;
}
}
return GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
controller.playerController
.seekTo(item['starttime']);
controller.playerController.startPlayer();
},
child: Container(
width: double.infinity,
padding: EdgeInsets.symmetric(
horizontal: 14.w,
vertical: 5.w,
),
child: Text(
item['content'],
style: TextStyle(
fontSize: 15.sp,
color: isActive ? Colors.red : Colors.black87,
letterSpacing: 0,
height: 1.4,
),
),
),
);
});
} }
}), }),
], ],
@ -183,6 +213,8 @@ class SpeechTab extends GetView<MeetingDetailsController> {
'编辑', '编辑',
() { () {
controller.isSpeakerText.value = true; controller.isSpeakerText.value = true;
controller.dragOffset.value = 0;
controller.isTop.value = true;
}, },
), ),
if (controller.meetingDetails.value.tasktype == 1 && if (controller.meetingDetails.value.tasktype == 1 &&

Loading…
Cancel
Save