updateExposureOffset method
Update the exposure offset using the exposure controller. 使用曝光控制器更新曝光值
Implementation
Future<void> updateExposureOffset(double value) async {
final previousSliderOffsetValue = currentExposureSliderOffset.value;
currentExposureSliderOffset.value = value;
// Normalize the new exposure value if exposures have steps.
if (exposureStep > 0) {
final double inv = 1.0 / exposureStep;
double roundedOffset = (value * inv).roundToDouble() / inv;
if (roundedOffset > maxAvailableExposureOffset) {
roundedOffset = (value * inv).floorToDouble() / inv;
} else if (roundedOffset < minAvailableExposureOffset) {
roundedOffset = (value * inv).ceilToDouble() / inv;
}
value = roundedOffset;
}
if (value == currentExposureOffset.value ||
value < minAvailableExposureOffset ||
value > maxAvailableExposureOffset) {
return;
}
final previousOffsetValue = currentExposureOffset.value;
currentExposureOffset.value = value;
bool hasError = false;
try {
realDebugPrint('Updating the exposure offset value: $value');
// Use [CameraPlatform] explicitly to reduce channel calls.
await wrapControllerMethod(
'setExposureOffset',
() => CameraPlatform.instance.setExposureOffset(
controller.cameraId,
value,
),
);
} catch (e, s) {
hasError = true;
currentExposureSliderOffset.value = previousSliderOffsetValue;
currentExposureOffset.value = previousOffsetValue;
handleErrorWithHandler(e, s, pickerConfig.onError);
} finally {
if (!hasError && !isFocusPointDisplays.value) {
isFocusPointDisplays.value = true;
}
restartExposurePointDisplayTimer();
restartExposureModeDisplayTimer();
restartExposureFadeOutTimer();
}
}