From a39fcdb929837cb52a2ac2d40807c724731c278b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E9=94=8B?= <2535831261@qq.com> Date: Fri, 5 Jun 2026 15:03:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=BD=95=E5=88=B6=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E7=9A=84=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B0=8F=E6=97=B6=E6=98=BE=E7=A4=BA=EF=BC=9B?= =?UTF-8?q?=E5=9C=A8=E5=BD=95=E5=88=B6=E9=A1=B5=E9=9D=A2=E4=B8=AD=E5=BC=95?= =?UTF-8?q?=E5=85=A5=E8=AE=A1=E6=97=B6=E5=99=A8=E7=BB=84=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E8=B0=83=E6=95=B4=E8=A7=A6=E6=91=B8=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E5=B1=82=E7=9A=84=E6=A0=B7=E5=BC=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/model_recording_session.dart | 5 ++- lib/features/recording/pages/page_record.dart | 3 +- .../widgets/widget_record_timer.dart | 45 +++++++++++++++++++ .../widget_recording_touch_lock_overlay.dart | 4 +- 4 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 lib/features/recording/widgets/widget_record_timer.dart diff --git a/lib/features/recording/model/model_recording_session.dart b/lib/features/recording/model/model_recording_session.dart index cb11732..32423b5 100644 --- a/lib/features/recording/model/model_recording_session.dart +++ b/lib/features/recording/model/model_recording_session.dart @@ -36,9 +36,10 @@ class RecordingSessionState { String get elapsedLabel { final totalSeconds = status.elapsedMillis ~/ 1000; - final minutes = (totalSeconds ~/ 60).toString().padLeft(2, '0'); + final hours = (totalSeconds ~/ 3600).toString().padLeft(2, '0'); + final minutes = ((totalSeconds % 3600) ~/ 60).toString().padLeft(2, '0'); final seconds = (totalSeconds % 60).toString().padLeft(2, '0'); - return '$minutes:$seconds'; + return '$hours:$minutes:$seconds'; } RecordingSessionState copyWith({ diff --git a/lib/features/recording/pages/page_record.dart b/lib/features/recording/pages/page_record.dart index 8810b11..9bc2b82 100644 --- a/lib/features/recording/pages/page_record.dart +++ b/lib/features/recording/pages/page_record.dart @@ -12,6 +12,7 @@ import 'package:recording_tool/features/recording/view-model/view_model_recordin import 'package:recording_tool/features/recording/widgets/widget_camera_preview.dart'; import 'package:recording_tool/features/recording/widgets/widget_record_footer.dart'; import 'package:recording_tool/features/recording/widgets/widget_record_header.dart'; +import 'package:recording_tool/features/recording/widgets/widget_record_timer.dart'; import 'package:recording_tool/features/recording/widgets/widget_recording_hud.dart'; import 'package:recording_tool/features/recording/widgets/widget_recording_loading_overlay.dart'; import 'package:recording_tool/features/recording/widgets/widget_recording_saved_dialog.dart'; @@ -224,7 +225,7 @@ class _RecordingPageState extends ConsumerState { const CameraPreviewWidget(), if (!state.isPreviewReady && state.errorMessage == null) const RecordingLoadingOverlayWidget(message: '正在启动相机…'), - + const RecordTimerWidget(), RecordingHudWidget( state: state, showClipboardHint: showClipboardInfo, diff --git a/lib/features/recording/widgets/widget_record_timer.dart b/lib/features/recording/widgets/widget_record_timer.dart new file mode 100644 index 0000000..fa0269f --- /dev/null +++ b/lib/features/recording/widgets/widget_record_timer.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:recording_tool/features/recording/view-model/view_model_recording.dart'; + +class RecordTimerWidget extends ConsumerStatefulWidget { + const RecordTimerWidget({super.key}); + + @override + ConsumerState createState() => _RecordTimerWidgetState(); +} + +class _RecordTimerWidgetState extends ConsumerState { + @override + Widget build(BuildContext context) { + final session = ref.watch( + recordingViewModelProvider.select((value) => value.session), + ); + final isRecording = session.isRecording; + final displayTime = isRecording ? session.elapsedLabel : '00:00:00'; + + return Positioned( + top: 13.r, + left: 0, + right: 0, + child: Center( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 5.r, vertical: 0.r), + decoration: BoxDecoration( + color: isRecording ? Colors.red : Colors.transparent, + borderRadius: BorderRadius.circular(6.r), + ), + child: Text( + displayTime, + style: TextStyle( + color: isRecording ? Colors.white : Colors.white70, + fontSize: 20.sp, + shadows: [Shadow(color: Colors.black54, blurRadius: 6.r)], + ), + ), + ), + ), + ); + } +} diff --git a/lib/features/recording/widgets/widget_recording_touch_lock_overlay.dart b/lib/features/recording/widgets/widget_recording_touch_lock_overlay.dart index 7903438..ae44c5a 100644 --- a/lib/features/recording/widgets/widget_recording_touch_lock_overlay.dart +++ b/lib/features/recording/widgets/widget_recording_touch_lock_overlay.dart @@ -74,7 +74,7 @@ class _RecordingTouchLockOverlayWidgetState child: Align( alignment: Alignment.topCenter, child: Padding( - padding: EdgeInsets.only(top: 48.r), + padding: EdgeInsets.only(top: 68.r), child: DecoratedBox( decoration: BoxDecoration( color: Colors.black54, @@ -89,7 +89,7 @@ class _RecordingTouchLockOverlayWidgetState _isHolding ? '保持按住 ${widget.unlockHoldDuration.inSeconds}s 解锁…' : '防误触已开启,按住 ${widget.unlockHoldDuration.inSeconds}s 解锁', - style: TextStyle(color: Colors.white, fontSize: 13.sp), + style: TextStyle(color: Colors.white, fontSize: 10.sp), ), ), ),