更新录制会话的时间格式,添加小时显示;在录制页面中引入计时器组件,并调整触摸锁定覆盖层的样式。
This commit is contained in:
@@ -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({
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
45
lib/features/recording/widgets/widget_record_timer.dart
Normal file
45
lib/features/recording/widgets/widget_record_timer.dart
Normal 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)],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user