Skip to content

Commit 602ecb7

Browse files
authored
⚡️ Improve tapping exposure updates (#109)
1 parent 6a84532 commit 602ecb7

File tree

4 files changed

+36
-13
lines changed

4 files changed

+36
-13
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ that can be found in the LICENSE file. -->
44

55
# Changelog
66

7-
## 3.3.1
7+
## 3.4.0
88

99
### New features
1010

1111
- Add `enableScaledPreview`. (#108)
1212

1313
### Improvements
1414

15+
- Improve tapping exposure updates. (#109)
1516
- Prevent unnecessary zoom updates. (#107)
1617

1718
## 3.3.0

example/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: wechat_camera_picker_demo
22
description: A new Flutter project.
3-
version: 3.3.1+12
3+
version: 3.4.0+13
44
publish_to: none
55

66
environment:

lib/src/widgets/camera_picker.dart

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'dart:math' as math;
99

1010
import 'package:bindings_compatible/bindings_compatible.dart';
1111
import 'package:camera/camera.dart';
12+
import 'package:camera_platform_interface/camera_platform_interface.dart';
1213
import 'package:flutter/gestures.dart';
1314
import 'package:flutter/material.dart';
1415
import 'package:flutter/semantics.dart';
@@ -154,13 +155,9 @@ class CameraPickerState extends State<CameraPicker>
154155
/// 当前曝光值
155156
final ValueNotifier<double> _currentExposureOffset = ValueNotifier<double>(0);
156157

157-
/// The maximum available value for exposure.
158-
/// 最大可用曝光值
159158
double _maxAvailableExposureOffset = 0;
160-
161-
/// The minimum available value for exposure.
162-
/// 最小可用曝光值
163159
double _minAvailableExposureOffset = 0;
160+
double _exposureStep = 0;
164161

165162
/// The maximum available value for zooming.
166163
/// 最大可用缩放值
@@ -426,10 +423,13 @@ class CameraPickerState extends State<CameraPicker>
426423
newController
427424
.lockCaptureOrientation(config.lockCaptureOrientation),
428425
newController
429-
.getMinExposureOffset()
430-
.then((double value) => _maxAvailableExposureOffset = value),
426+
.getExposureOffsetStepSize()
427+
.then((double value) => _exposureStep = value),
431428
newController
432429
.getMaxExposureOffset()
430+
.then((double value) => _maxAvailableExposureOffset = value),
431+
newController
432+
.getMinExposureOffset()
433433
.then((double value) => _minAvailableExposureOffset = value),
434434
newController
435435
.getMaxZoomLevel()
@@ -603,12 +603,33 @@ class CameraPickerState extends State<CameraPicker>
603603

604604
/// Update the exposure offset using the exposure controller.
605605
/// 使用曝光控制器更新曝光值
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) {
608621
return;
609622
}
610623
_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+
}
612633
if (!_isExposureModeDisplays.value) {
613634
_isExposureModeDisplays.value = true;
614635
}

pubspec.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: wechat_camera_picker
22
description: A camera picker which is an extension to wechat_assets_picker, but can be run separately.
3-
version: 3.3.1
3+
version: 3.4.0
44
homepage: https://github.com/fluttercandies/flutter_wechat_camera_picker
55

66
environment:
@@ -13,6 +13,7 @@ dependencies:
1313

1414
bindings_compatible: ^1.0.1
1515
camera: ^0.9.6
16+
camera_platform_interface: ^2.1.5
1617
path: ^1.8.0
1718
path_provider: ^2.0.8
1819
photo_manager: ^2.1.0+2

0 commit comments

Comments
 (0)