Я обнаружил, что самый простой способ узнать текущий масштаб - это отслеживать его при каждом изменении.
Следующий контроллер масштабирования можно использовать как для вычисления нового масштабирования, так и для получения текущего масштабирования, который фактически является только кэшированным значением, которое передается методу .set ():
public final class Zoom
{
private static final float DEFAULT_ZOOM_FACTOR = 1.0f;
@NonNull
private final Rect mCropRegion = new Rect();
public final float maxZoom;
private float mCurrentZoomFactor = Zoom.DEFAULT_ZOOM_FACTOR;
@Nullable
private final Rect mSensorSize;
public final boolean hasSupport;
public Zoom(@NonNull final CameraCharacteristics characteristics)
{
this.mSensorSize = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
if (this.mSensorSize == null)
{
this.maxZoom = Zoom.DEFAULT_ZOOM_FACTOR;
this.hasSupport = false;
return;
}
final Float value = characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
this.maxZoom = ((value == null) || (value < Zoom.DEFAULT_ZOOM_FACTOR))
? Zoom.DEFAULT_ZOOM_FACTOR
: value;
this.hasSupport = (Float.compare(this.maxZoom, Zoom.DEFAULT_ZOOM_FACTOR) > 0);
}
public void set(@NonNull final CaptureRequest.Builder builder, final float newZoom)
{
if (this.hasSupport == false)
{
return;
}
this.mCurrentZoomFactor = MathUtils.clamp(newZoom, Zoom.DEFAULT_ZOOM_FACTOR, this.maxZoom);
final int centerX = this.mSensorSize.width() / 2;
final int centerY = this.mSensorSize.height() / 2;
final int deltaX = (int)((0.5f * this.mSensorSize.width()) / this.mCurrentZoomFactor);
final int deltaY = (int)((0.5f * this.mSensorSize.height()) / this.mCurrentZoomFactor);
this.mCropRegion.set(centerX - deltaX,
centerY - deltaY,
centerX + deltaX,
centerY + deltaY);
builder.set(CaptureRequest.SCALER_CROP_REGION, this.mCropRegion);
}
public float get()
{
return this.mCurrentZoomFactor;
}
}
После вызова zoom.set (...), используйте следующий фрагмент, чтобы зафиксировать и применить новый коэффициент масштабирования в активном сеансе камеры. Это необходимо сделать как для активного сеанса предварительного просмотра, так и для сеанса захвата при съемке фотографии:
yourCameraSession.setRepeatingRequest(builder.build(), yourPreviewOrCaptureSessionCallback, yourCameraThreadHandler);