Smart_Vision_Assist_App/lib/screens/camera_screen.dart

127 lines
3.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
class CameraScreen extends StatefulWidget {
@override
_CameraScreenState createState() => _CameraScreenState();
}
class _CameraScreenState extends State<CameraScreen> {
CameraController? controller;
List<CameraDescription>? cameras;
bool isRecording = false;
@override
void initState() {
super.initState();
initCamera();
}
Future<void> initCamera() async {
cameras = await availableCameras();
controller = CameraController(
cameras![0],
ResolutionPreset.high,
);
await controller!.initialize();
setState(() {});
}
// 🔴 START RECORD
Future<void> startRecording() async {
if (!controller!.value.isRecordingVideo) {
await controller!.startVideoRecording();
setState(() {
isRecording = true;
});
}
}
// ⏹ STOP RECORD
Future<void> stopRecording() async {
if (controller!.value.isRecordingVideo) {
await controller!.stopVideoRecording();
setState(() {
isRecording = false;
});
}
}
@override
void dispose() {
controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (controller == null || !controller!.value.isInitialized) {
return Scaffold(
body: Center(child: CircularProgressIndicator()),
);
}
return Scaffold(
body: Stack(
children: [
// 📷 PREVIEW KAMERA (FULL SCREEN)
Positioned.fill(
child: CameraPreview(controller!),
),
// 🔙 TOMBOL KEMBALI (KANAN BAWAH)
Positioned(
bottom: 40,
right: 30,
child: Semantics(
label: "Kembali",
button: true,
child: FloatingActionButton(
backgroundColor: Colors.black,
onPressed: () {
Navigator.pop(context);
},
child: Icon(Icons.arrow_back),
),
),
),
// 🔘 TOMBOL RECORD (TENGAH BAWAH)
Positioned(
bottom: 30,
left: MediaQuery.of(context).size.width / 2 - 35,
child: Semantics(
label: isRecording ? "Stop rekam" : "Mulai rekam",
button: true,
child: GestureDetector(
onTap: () {
if (isRecording) {
stopRecording();
} else {
startRecording();
}
},
child: Container(
width: 70,
height: 70,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: isRecording ? Colors.red : Colors.white,
border: Border.all(color: Colors.grey, width: 4),
),
child: Icon(
isRecording ? Icons.stop : Icons.circle,
color: isRecording ? Colors.white : Colors.red,
size: 30,
),
),
),
),
),
],
),
);
}
}