Commit 7237a453 authored by Nasar's avatar Nasar
Browse files

zoom levels added on camera capture

parent d1971eb7
No related merge requests found
Showing with 163 additions and 9 deletions
+163 -9
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"camera_avfoundation","path":"C:\\\\Users\\\\NasarUddin\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\camera_avfoundation-0.9.18+8\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"camera_android_camerax","path":"C:\\\\Users\\\\NasarUddin\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\camera_android_camerax-0.6.14\\\\","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"C:\\\\Users\\\\NasarUddin\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\flutter_plugin_android_lifecycle-2.0.22\\\\","native_build":true,"dependencies":[]}],"macos":[],"linux":[],"windows":[],"web":[{"name":"camera_web","path":"C:\\\\Users\\\\NasarUddin\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\camera_web-0.3.5\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"camera","dependencies":["camera_android_camerax","camera_avfoundation","camera_web","flutter_plugin_android_lifecycle"]},{"name":"camera_android_camerax","dependencies":[]},{"name":"camera_avfoundation","dependencies":[]},{"name":"camera_web","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]}],"date_created":"2025-03-03 11:16:11.792988","version":"3.27.1","swift_package_manager_enabled":false}
\ No newline at end of file
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"camera_avfoundation","path":"C:\\\\Users\\\\NasarUddin\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\camera_avfoundation-0.9.18+8\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"camera_android_camerax","path":"C:\\\\Users\\\\NasarUddin\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\camera_android_camerax-0.6.14\\\\","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"C:\\\\Users\\\\NasarUddin\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\flutter_plugin_android_lifecycle-2.0.22\\\\","native_build":true,"dependencies":[]}],"macos":[],"linux":[],"windows":[],"web":[{"name":"camera_web","path":"C:\\\\Users\\\\NasarUddin\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\camera_web-0.3.5\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"camera","dependencies":["camera_android_camerax","camera_avfoundation","camera_web","flutter_plugin_android_lifecycle"]},{"name":"camera_android_camerax","dependencies":[]},{"name":"camera_avfoundation","dependencies":[]},{"name":"camera_web","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]}],"date_created":"2025-03-25 12:48:25.764597","version":"3.27.1","swift_package_manager_enabled":false}
\ No newline at end of file
{
"version": "0.2.0",
"configurations": [
{
"name": "Example",
"request": "launch",
"type": "dart",
"flutterMode": "debug",
"program": "example/lib/main.dart",
}
]
}
\ No newline at end of file
......@@ -45,6 +45,7 @@ class _MyHomePageState extends State<MyHomePage> {
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
spacing: 16,
children: [
Row(),
ElevatedButton(
......@@ -53,7 +54,14 @@ class _MyHomePageState extends State<MyHomePage> {
log(capturedImage?.path ?? "-");
},
child: const Text("Single camera"),
)
),
ElevatedButton(
onPressed: () async {
final capturedImage = await MCamera.openBatchImageCapture(context);
log(capturedImage.toString());
},
child: const Text("Multi camera"),
),
],
),
);
......
extension NumberExtension on num? {
bool get isNull => this == null;
bool get isNullOrZero => isNull || this == 0;
num get removeDecimalPointIfPossible {
if (isNullOrZero) return 0;
if (this! > 0 && this! < 1) {
return this!;
}
final bool hasReminder = (this! % this!.floor()) > 0;
if (hasReminder) return this!;
return this!.floor();
}
}
import 'package:camera/camera.dart';
import 'package:flutter/widgets.dart';
import 'package:m_camera/core/widgets/zoom_controls.dart';
class MCameraPreviewe extends StatelessWidget {
const MCameraPreviewe({
super.key,
required this.controller,
});
final CameraController controller;
@override
Widget build(BuildContext context) {
return Center(
child: Stack(
children: [
Align(
alignment: Alignment.center,
child: CameraPreview(controller),
// child: controller.buildPreview(),
),
Align(
alignment: Alignment.bottomRight,
child: ZoomControls(
controller: controller,
),
),
],
),
);
}
}
import 'dart:developer';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:m_camera/core/extension/number_extension.dart';
class ZoomControls extends StatefulWidget {
const ZoomControls({
super.key,
required this.controller,
});
final CameraController controller;
@override
State<ZoomControls> createState() => _ZoomControlsState();
}
class _ZoomControlsState extends State<ZoomControls> {
final circleWidth = 34.0;
final List<double> zoomLevels = const [1, 2, 4];
double activeZoomLevel = 1;
@override
void initState() {
_init();
super.initState();
}
_init() async {
widget.controller.setZoomLevel(activeZoomLevel);
final minZoomLevel = await widget.controller.getMinZoomLevel();
final maxZoomLevel = await widget.controller.getMaxZoomLevel();
log("Min: $minZoomLevel, Max: $maxZoomLevel -------------------------");
}
@override
Widget build(BuildContext context) {
return Container(
alignment: Alignment.center,
margin: const EdgeInsets.only(bottom: 15),
height: circleWidth + 4,
child: Container(
padding: const EdgeInsets.all(2),
decoration: BoxDecoration(
color: Colors.black.withValues(alpha: 0.25),
borderRadius: BorderRadius.circular(circleWidth + 2),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
for (final level in zoomLevels) _buildCircleText(level, level == activeZoomLevel),
],
),
),
);
}
Widget _buildCircleText(double text, bool isActive) {
return GestureDetector(
onTap: () {
setState(() {
activeZoomLevel = text;
widget.controller.setZoomLevel(activeZoomLevel);
});
},
child: Container(
height: circleWidth,
width: circleWidth,
alignment: Alignment.center,
padding: const EdgeInsets.all(5),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(circleWidth / 2),
color: isActive ? Colors.black.withValues(alpha: 0.7) : null,
),
child: Text(
"${text.removeDecimalPointIfPossible}${isActive ? 'x' : ''}",
style: const TextStyle(color: Colors.white),
),
),
);
}
}
......@@ -5,6 +5,7 @@ import 'package:camera/camera.dart';
import 'package:m_camera/core/enums/enums.dart';
import 'package:m_camera/core/widgets/capture_icon.dart';
import 'package:m_camera/core/widgets/flash_mode_changer.dart';
import 'package:m_camera/core/widgets/m_camera_preview.dart';
import 'package:m_camera/core/widgets/preview_captured_images.dart';
class BatchCapture extends StatefulWidget {
......@@ -108,7 +109,8 @@ class _BatchCaptureState extends State<BatchCapture> {
),
),
Flexible(
child: Center(child: CameraPreview(controller)),
child: MCameraPreviewe(controller: controller),
// child: Center(child: CameraPreview(controller)),
// child: Center(child: controller.buildPreview()),
),
Padding(
......@@ -174,7 +176,7 @@ class _BatchCaptureState extends State<BatchCapture> {
}
void showCapturedImagesPreview() async {
controller.pausePreview();
// controller.pausePreview();
await showModalBottomSheet(
context: context,
backgroundColor: Colors.white,
......@@ -182,7 +184,7 @@ class _BatchCaptureState extends State<BatchCapture> {
useSafeArea: true,
builder: (context) => PreviewCapturedImages(capturedImages: capturedImages),
);
controller.resumePreview();
// controller.resumePreview();
setState(() {});
}
......
......@@ -5,6 +5,7 @@ import 'package:camera/camera.dart';
import 'package:m_camera/core/enums/enums.dart';
import 'package:m_camera/core/widgets/capture_icon.dart';
import 'package:m_camera/core/widgets/flash_mode_changer.dart';
import 'package:m_camera/core/widgets/m_camera_preview.dart';
class SingleCapture extends StatefulWidget {
const SingleCapture({super.key, required this.resolution});
......@@ -110,7 +111,7 @@ class _SingleCaptureState extends State<SingleCapture> {
child: Image.file(File(capturedImage!.path)),
)
: Flexible(
child: Center(child: CameraPreview(controller)),
child: MCameraPreviewe(controller: controller),
),
Padding(
padding: const EdgeInsets.symmetric(
......@@ -146,7 +147,7 @@ class _SingleCaptureState extends State<SingleCapture> {
? const SizedBox()
: Center(
child: GestureDetector(
onTap: (){
onTap: () {
Navigator.pop(context, File(capturedImage!.path));
},
child: Container(
......
name: m_camera
description: "A new Flutter package project."
version: 0.0.2
description: "A camera plugin that can capture single or multiple images."
version: 0.0.3
# homepage:
environment:
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment