更新超广角相机的变焦比例,确保在相机能力允许的情况下使用0.6x的缩放比例,优化相关UI和测试用例。
This commit is contained in:
@@ -32,6 +32,7 @@ class RecordingCameraController(
|
||||
private var camera: Camera? = null
|
||||
private var mainCameraId: String? = null
|
||||
private var ultraWideCameraId: String? = null
|
||||
private var ultraWideZoomRatio: Float = DEFAULT_ULTRA_WIDE_ZOOM_RATIO
|
||||
private var currentLensMode: LensMode = LensMode.MAIN
|
||||
private var activeRecording: Recording? = null
|
||||
private var boundLifecycleOwner: LifecycleOwner? = null
|
||||
@@ -224,11 +225,16 @@ class RecordingCameraController(
|
||||
|
||||
fun zoomCapabilitiesMap(): Map<String, Any> {
|
||||
val zoomState = camera?.cameraInfo?.zoomState?.value
|
||||
val minZoom = if (hasUltraWideCamera()) 0.5f else (zoomState?.minZoomRatio ?: 1f)
|
||||
val minZoom =
|
||||
if (hasUltraWideCamera()) {
|
||||
ultraWideZoomRatio
|
||||
} else {
|
||||
zoomState?.minZoomRatio ?: 1f
|
||||
}
|
||||
val maxZoom = zoomState?.maxZoomRatio ?: 3f
|
||||
val zoom =
|
||||
if (currentLensMode == LensMode.ULTRA_WIDE) {
|
||||
0.5f
|
||||
ultraWideZoomRatio
|
||||
} else {
|
||||
(zoomState?.zoomRatio ?: currentZoomRatio).coerceIn(minZoom, maxZoom)
|
||||
}
|
||||
@@ -248,7 +254,7 @@ class RecordingCameraController(
|
||||
if (boundCamera == null) {
|
||||
val clamped =
|
||||
if (ratio < 1.0 && hasUltraWideCamera()) {
|
||||
0.5f
|
||||
ultraWideZoomRatio
|
||||
} else {
|
||||
ratio.toFloat().coerceAtLeast(1f)
|
||||
}
|
||||
@@ -299,6 +305,7 @@ class RecordingCameraController(
|
||||
boundLifecycleOwner = null
|
||||
currentLensMode = LensMode.MAIN
|
||||
currentZoomRatio = 1f
|
||||
ultraWideZoomRatio = DEFAULT_ULTRA_WIDE_ZOOM_RATIO
|
||||
updateStatus(RecordingStatus(RecordingState.IDLE))
|
||||
}
|
||||
|
||||
@@ -315,7 +322,7 @@ class RecordingCameraController(
|
||||
private fun applyCurrentZoom() {
|
||||
val boundCamera = camera ?: return
|
||||
if (currentLensMode == LensMode.ULTRA_WIDE) {
|
||||
currentZoomRatio = 0.5f
|
||||
currentZoomRatio = ultraWideZoomRatio
|
||||
boundCamera.cameraControl.setZoomRatio(1f)
|
||||
return
|
||||
}
|
||||
@@ -334,12 +341,18 @@ class RecordingCameraController(
|
||||
if (mainCameraId == null) {
|
||||
mainCameraId = cameraIdForSelector(provider, CameraSelector.DEFAULT_BACK_CAMERA)
|
||||
}
|
||||
ultraWideCameraId = findUltraWideCameraId(provider, mainCameraId)
|
||||
if (ultraWideCameraId == null && currentLensMode == LensMode.ULTRA_WIDE) {
|
||||
val ultraWideCamera = findUltraWideCamera(provider, mainCameraId)
|
||||
ultraWideCameraId = ultraWideCamera?.cameraId
|
||||
ultraWideZoomRatio = ultraWideCamera?.zoomRatio ?: DEFAULT_ULTRA_WIDE_ZOOM_RATIO
|
||||
if (ultraWideCamera == null && currentLensMode == LensMode.ULTRA_WIDE) {
|
||||
currentLensMode = LensMode.MAIN
|
||||
currentZoomRatio = 1f
|
||||
}
|
||||
Log.d(TAG, "mainCameraId=$mainCameraId ultraWideCameraId=$ultraWideCameraId")
|
||||
Log.d(
|
||||
TAG,
|
||||
"mainCameraId=$mainCameraId ultraWideCameraId=$ultraWideCameraId " +
|
||||
"ultraWideZoomRatio=$ultraWideZoomRatio",
|
||||
)
|
||||
}
|
||||
|
||||
private fun cameraIdForSelector(
|
||||
@@ -355,10 +368,10 @@ class RecordingCameraController(
|
||||
}
|
||||
}
|
||||
|
||||
private fun findUltraWideCameraId(
|
||||
private fun findUltraWideCamera(
|
||||
provider: ProcessCameraProvider,
|
||||
excludedCameraId: String?,
|
||||
): String? {
|
||||
): UltraWideCamera? {
|
||||
val manager = appContext.getSystemService(Context.CAMERA_SERVICE) as CameraManager
|
||||
val candidates =
|
||||
manager.cameraIdList
|
||||
@@ -373,13 +386,17 @@ class RecordingCameraController(
|
||||
val mainProfile = excludedCameraId?.let { backCameraProfile(manager, it) }
|
||||
val widest = candidates.firstOrNull() ?: return null
|
||||
if (mainProfile == null) {
|
||||
return widest.cameraId
|
||||
return UltraWideCamera(widest.cameraId, DEFAULT_ULTRA_WIDE_ZOOM_RATIO)
|
||||
}
|
||||
|
||||
val meaningfullyWider =
|
||||
widest.horizontalFov > mainProfile.horizontalFov * ULTRA_WIDE_FOV_FACTOR ||
|
||||
widest.minFocalLength < mainProfile.minFocalLength * ULTRA_WIDE_FOCAL_FACTOR
|
||||
return if (meaningfullyWider) widest.cameraId else null
|
||||
if (!meaningfullyWider) {
|
||||
return null
|
||||
}
|
||||
|
||||
return UltraWideCamera(widest.cameraId, DEFAULT_ULTRA_WIDE_ZOOM_RATIO)
|
||||
}
|
||||
|
||||
private fun backCameraProfile(
|
||||
@@ -457,7 +474,7 @@ class RecordingCameraController(
|
||||
return
|
||||
}
|
||||
if (currentLensMode == LensMode.ULTRA_WIDE) {
|
||||
currentZoomRatio = 0.5f
|
||||
currentZoomRatio = ultraWideZoomRatio
|
||||
onComplete(true, zoomCapabilitiesMap(), null)
|
||||
return
|
||||
}
|
||||
@@ -473,7 +490,7 @@ class RecordingCameraController(
|
||||
}
|
||||
try {
|
||||
currentLensMode = LensMode.ULTRA_WIDE
|
||||
currentZoomRatio = 0.5f
|
||||
currentZoomRatio = ultraWideZoomRatio
|
||||
bindUseCases(provider, lifecycleOwner, selectorForCameraId(ultraWideId))
|
||||
applyCurrentZoom()
|
||||
onComplete(true, zoomCapabilitiesMap(), null)
|
||||
@@ -539,8 +556,14 @@ class RecordingCameraController(
|
||||
val horizontalFov: Double,
|
||||
)
|
||||
|
||||
private data class UltraWideCamera(
|
||||
val cameraId: String,
|
||||
val zoomRatio: Float,
|
||||
)
|
||||
|
||||
companion object {
|
||||
private const val TAG = "RecordingCamera"
|
||||
private const val DEFAULT_ULTRA_WIDE_ZOOM_RATIO = 0.6f
|
||||
private const val ULTRA_WIDE_FOV_FACTOR = 1.08
|
||||
private const val ULTRA_WIDE_FOCAL_FACTOR = 0.92
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user