@@ -9,6 +9,7 @@ import 'dart:math' as math;
9
9
10
10
import 'package:bindings_compatible/bindings_compatible.dart' ;
11
11
import 'package:camera/camera.dart' ;
12
+ import 'package:camera_platform_interface/camera_platform_interface.dart' ;
12
13
import 'package:flutter/gestures.dart' ;
13
14
import 'package:flutter/material.dart' ;
14
15
import 'package:flutter/semantics.dart' ;
@@ -154,13 +155,9 @@ class CameraPickerState extends State<CameraPicker>
154
155
/// 当前曝光值
155
156
final ValueNotifier <double > _currentExposureOffset = ValueNotifier <double >(0 );
156
157
157
- /// The maximum available value for exposure.
158
- /// 最大可用曝光值
159
158
double _maxAvailableExposureOffset = 0 ;
160
-
161
- /// The minimum available value for exposure.
162
- /// 最小可用曝光值
163
159
double _minAvailableExposureOffset = 0 ;
160
+ double _exposureStep = 0 ;
164
161
165
162
/// The maximum available value for zooming.
166
163
/// 最大可用缩放值
@@ -426,10 +423,13 @@ class CameraPickerState extends State<CameraPicker>
426
423
newController
427
424
.lockCaptureOrientation (config.lockCaptureOrientation),
428
425
newController
429
- .getMinExposureOffset ()
430
- .then ((double value) => _maxAvailableExposureOffset = value),
426
+ .getExposureOffsetStepSize ()
427
+ .then ((double value) => _exposureStep = value),
431
428
newController
432
429
.getMaxExposureOffset ()
430
+ .then ((double value) => _maxAvailableExposureOffset = value),
431
+ newController
432
+ .getMinExposureOffset ()
433
433
.then ((double value) => _minAvailableExposureOffset = value),
434
434
newController
435
435
.getMaxZoomLevel ()
@@ -603,12 +603,33 @@ class CameraPickerState extends State<CameraPicker>
603
603
604
604
/// Update the exposure offset using the exposure controller.
605
605
/// 使用曝光控制器更新曝光值
606
- void updateExposureOffset (double value) {
607
- if (value == _currentExposureOffset.value) {
606
+ Future <void > updateExposureOffset (double value) async {
607
+ // Normalize the new exposure value if exposures have steps.
608
+ if (_exposureStep > 0 ) {
609
+ final double inv = 1.0 / _exposureStep;
610
+ double roundedOffset = (value * inv).roundToDouble () / inv;
611
+ if (roundedOffset > _maxAvailableExposureOffset) {
612
+ roundedOffset = (value * inv).floorToDouble () / inv;
613
+ } else if (roundedOffset < _minAvailableExposureOffset) {
614
+ roundedOffset = (value * inv).ceilToDouble () / inv;
615
+ }
616
+ value = roundedOffset;
617
+ }
618
+ if (value == _currentExposureOffset.value ||
619
+ value < _minAvailableExposureOffset ||
620
+ value > _maxAvailableExposureOffset) {
608
621
return ;
609
622
}
610
623
_currentExposureOffset.value = value;
611
- controller.setExposureOffset (value);
624
+ try {
625
+ // Use [CameraPlatform] explicitly to reduce channel calls.
626
+ await CameraPlatform .instance.setExposureOffset (
627
+ controller.cameraId,
628
+ value,
629
+ );
630
+ } catch (e, s) {
631
+ handleErrorWithHandler (e, config.onError, s: s);
632
+ }
612
633
if (! _isExposureModeDisplays.value) {
613
634
_isExposureModeDisplays.value = true ;
614
635
}
0 commit comments