更新录制会话的时间格式,添加小时显示;在录制页面中引入计时器组件,并调整触摸锁定覆盖层的样式。

This commit is contained in:
2026-06-05 15:03:53 +08:00
parent 0a2cfe27ac
commit a39fcdb929
4 changed files with 52 additions and 5 deletions

View File

@@ -36,9 +36,10 @@ class RecordingSessionState {
String get elapsedLabel { String get elapsedLabel {
final totalSeconds = status.elapsedMillis ~/ 1000; 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'); final seconds = (totalSeconds % 60).toString().padLeft(2, '0');
return '$minutes:$seconds'; return '$hours:$minutes:$seconds';
} }
RecordingSessionState copyWith({ RecordingSessionState copyWith({

View File

@@ -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_camera_preview.dart';
import 'package:recording_tool/features/recording/widgets/widget_record_footer.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_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_hud.dart';
import 'package:recording_tool/features/recording/widgets/widget_recording_loading_overlay.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'; import 'package:recording_tool/features/recording/widgets/widget_recording_saved_dialog.dart';
@@ -224,7 +225,7 @@ class _RecordingPageState extends ConsumerState<RecordingPage> {
const CameraPreviewWidget(), const CameraPreviewWidget(),
if (!state.isPreviewReady && state.errorMessage == null) if (!state.isPreviewReady && state.errorMessage == null)
const RecordingLoadingOverlayWidget(message: '正在启动相机…'), const RecordingLoadingOverlayWidget(message: '正在启动相机…'),
const RecordTimerWidget(),
RecordingHudWidget( RecordingHudWidget(
state: state, state: state,
showClipboardHint: showClipboardInfo, showClipboardHint: showClipboardInfo,

View File

@@ -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<RecordTimerWidget> createState() => _RecordTimerWidgetState();
}
class _RecordTimerWidgetState extends ConsumerState<RecordTimerWidget> {
@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)],
),
),
),
),
);
}
}

View File

@@ -74,7 +74,7 @@ class _RecordingTouchLockOverlayWidgetState
child: Align( child: Align(
alignment: Alignment.topCenter, alignment: Alignment.topCenter,
child: Padding( child: Padding(
padding: EdgeInsets.only(top: 48.r), padding: EdgeInsets.only(top: 68.r),
child: DecoratedBox( child: DecoratedBox(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.black54, color: Colors.black54,
@@ -89,7 +89,7 @@ class _RecordingTouchLockOverlayWidgetState
_isHolding _isHolding
? '保持按住 ${widget.unlockHoldDuration.inSeconds}s 解锁…' ? '保持按住 ${widget.unlockHoldDuration.inSeconds}s 解锁…'
: '防误触已开启,按住 ${widget.unlockHoldDuration.inSeconds}s 解锁', : '防误触已开启,按住 ${widget.unlockHoldDuration.inSeconds}s 解锁',
style: TextStyle(color: Colors.white, fontSize: 13.sp), style: TextStyle(color: Colors.white, fontSize: 10.sp),
), ),
), ),
), ),