Publicado por Donovan McMurray – Ingeniero de relaciones con desarrolladores
CámaraXLa biblioteca de cámaras Jetpack de Android está recibiendo una interesante actualización de su función de cámara dual simultánea, lo que facilita aún más la integración de esta función en su aplicación. Esta función le permite transmitir desde 2 cámaras diferentes al mismo tiempo. La versión original de Dual Concurrent Camera se lanzó en CameraX 1.3.0 y ya fue un gran paso adelante para facilitar la implementación de esta función.
comenzando con 1.5.0-alfa01CameraX ahora también gestionará la composición de las 2 transmisiones de cámara. Esta actualización es una característica adicional y no elimina ninguna funcionalidad anterior ni constituye un cambio material en el código de cámara dual simultánea existente. Para decirle a CameraX que maneje la composición, simplemente use el nuevo constructor SingleCameraConfig que tiene un nuevo parámetro para un Configuración de composición objeto. Dado que creará 2 SingleCameraConfigs, debe ser coherente con el constructor que utilice.
No ha cambiado nada en la forma de controlar la compatibilidad con cámaras simultáneas en comparación con la versión anterior de esta función. Como recordatorio, así es como se ve el código.
// Configure los interruptores de la cámara primaria y secundaria si son compatibles con el dispositivo. varCameraSelector principal: CameraSelector? = nulo varCameraSelector secundario: CameraSelector? = null for (cameraInfos in cameraProvider.availableConcurrentCameraInfos) { PrimaryCameraSelector = cameraInfos.first { it.lensFacing == CameraSelector.LENS_FACING_FRONT }.cameraSelector secondCameraSelector = cameraInfos.first { it.lensFacing == CameraSelector.LENS_FACING_BACK }.cameraSelector if (primaryCameraSelector == null ||. SecondaryCameraSelector == null) { // Si no se encontró un selector primario o secundario, reinicie ambos // para pasar a la siguiente lista de CameraInfos. PrimaryCameraSelector = null secondCameraSelector = null } else { // Si se encontraron tanto el selector de cámara principal como el secundario, podemos // finalizar la búsqueda. break } } if (primaryCameraSelector == null || secondCameraSelector == null) { // Cámara frontal y trasera simultáneas no disponibles. Gestione usted mismo en consecuencia. }
Aquí está el fragmento de código actualizado que muestra cómo implementar imagen en imagen, con la transmisión de la cámara frontal reducida para ajustarse a la esquina inferior derecha. En este ejemplo, CameraX maneja la composición de las transmisiones de la cámara.
// Si se encuentran 2 selectores de cámara simultáneos, cree 2 SingleCameraConfigs // y compóngalos en un diseño de imagen en imagen. val primario = SingleCameraConfig( cameraSelectorPrimary, useCaseGroup, CompositionSettings.Builder() .setAlpha(1.0f) .setOffset(0.0f, 0.0f) .setScale(1.0f, 1.0f) .build(), lifecycleOwner); val secundario = SingleCameraConfig( cameraSelectorSecondary, useCaseGroup, CompositionSettings.Builder() .setAlpha(1.0f) .setOffset(2/3f – 0.1f, -2/3f + 0.1f) .setScale(1/3f, 1/3f). build() propietario del ciclo de vida); // Vincular al ciclo de vida ConcurrentCamera concurrentCamera = cameraProvider.bindToLifecycle(listOf(primary, secondary));
No está limitado a un diseño de imagen en imagen. Por ejemplo, podría definir un diseño en mosaico y establecer los desplazamientos y factores de escala en consecuencia. Desea mantener ambas dimensiones escaladas en la misma cantidad para evitar una vista previa ampliada. Así es como podría verse.
// Si se encuentran 2 selectores de cámara simultáneos, cree 2 SingleCameraConfigs // y compóngalos en un diseño de imagen en imagen. val primario = SingleCameraConfig( cameraSelectorPrimary, useCaseGroup, CompositionSettings.Builder() .setAlpha(1.0f) .setOffset(0.0f, 0.25f) .setScale(0.5f, 0.5f) .build(), lifecycleOwner); val secundario = SingleCameraConfig( cameraSelectorSecondary, useCaseGroup, CompositionSettings.Builder() .setAlpha(1.0f) .setOffset(0.5f, 0.25f) .setScale(0.5f, 0.5f) .build() lifecycleOwner); // Vincular al ciclo de vida ConcurrentCamera concurrentCamera = cameraProvider.bindToLifecycle(listOf(primary, secondary));
Estamos entusiasmados de incorporar esta mejora a una función que ya es fácil de usar para los desarrolladores. ¡Verdaderamente el estilo CameraX! La configuración de composición en la cámara dual simultánea se encuentra actualmente en versión alfa, por lo que si tiene solicitudes de funciones para mejorarlas antes de que se bloquee la API, envíenos sus comentarios en la sección Grupo de discusión de CameraX. Y revisa el CameraX completa 1.5.0-alpha01 Notas de la versión para ver qué más hay de nuevo en CameraX.