This commit is contained in:
otsmr 2025-05-20 21:57:37 +02:00
parent b6502ca8d0
commit 50c859f13f

View file

@ -47,6 +47,10 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
bool videoWithAudio = true; bool videoWithAudio = true;
DateTime? videoRecordingStarted; DateTime? videoRecordingStarted;
Timer? videoRecordingTimer; Timer? videoRecordingTimer;
double _minAvailableZoom = 1.0;
double _maxAvailableZoom = 1.0;
DateTime currentTime = DateTime.now(); DateTime currentTime = DateTime.now();
final GlobalKey keyTriggerButton = GlobalKey(); final GlobalKey keyTriggerButton = GlobalKey();
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
@ -109,7 +113,10 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
} }
setState(() { setState(() {
isZoomAble = false; isZoomAble = false;
scaleFactor = 1; if (cameraId != sCameraId) {
// switch between front and back
scaleFactor = 1;
}
}); });
controller = CameraController( controller = CameraController(
gCameras[sCameraId], gCameras[sCameraId],
@ -120,9 +127,17 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
if (!mounted) { if (!mounted) {
return; return;
} }
await controller!.setZoomLevel(scaleFactor);
await controller?.lockCaptureOrientation(DeviceOrientation.portraitUp); await controller?.lockCaptureOrientation(DeviceOrientation.portraitUp);
controller?.setFlashMode(isFlashOn ? FlashMode.always : FlashMode.off); controller?.setFlashMode(isFlashOn ? FlashMode.always : FlashMode.off);
controller
?.getMaxZoomLevel()
.then((double value) => _maxAvailableZoom = value);
controller
?.getMinZoomLevel()
.then((double value) => _minAvailableZoom = value);
isZoomAble = await controller?.getMinZoomLevel() != isZoomAble = await controller?.getMinZoomLevel() !=
await controller?.getMaxZoomLevel(); await controller?.getMaxZoomLevel();
setState(() { setState(() {
@ -147,16 +162,8 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
Future<void> updateScaleFactor(double newScale) async { Future<void> updateScaleFactor(double newScale) async {
if (scaleFactor == newScale || controller == null) return; if (scaleFactor == newScale || controller == null) return;
var minFactor = await controller!.getMinZoomLevel(); await controller
var maxFactor = await controller!.getMaxZoomLevel(); ?.setZoomLevel(newScale.clamp(_minAvailableZoom, _maxAvailableZoom));
if (newScale < minFactor) {
newScale = minFactor;
}
if (newScale > maxFactor) {
newScale = maxFactor;
}
await controller?.setZoomLevel(newScale);
setState(() { setState(() {
scaleFactor = newScale; scaleFactor = newScale;
}); });
@ -279,22 +286,12 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
if (isFront) { if (isFront) {
return; return;
} }
var diff = basePanY - details.localPosition.dy;
var baseDiff = Platform.isAndroid ? 200.0 : 300.0; scaleFactor = (baseScaleFactor + (basePanY - details.localPosition.dy) / 30)
.clamp(1, _maxAvailableZoom);
if (diff > baseDiff) diff = baseDiff; await controller!.setZoomLevel(scaleFactor);
if (diff < -baseDiff) diff = -baseDiff; setState(() {});
var tmp = 0.0;
if (Platform.isAndroid) {
tmp = (diff / baseDiff * (7 * 2)).toInt() / 2;
} else {
tmp = (diff / baseDiff * (14 * 2)).toInt() / 4;
}
tmp = baseScaleFactor + tmp;
if (tmp < 1) tmp = 1;
updateScaleFactor(tmp);
} }
Future pickImageFromGallery() async { Future pickImageFromGallery() async {