Red de conocimientos turísticos - Conocimientos sobre calendario chino - Mostrar vista previa de la cámara usando la vista previa

Mostrar vista previa de la cámara usando la vista previa

Mostrar vista previa de la cámara es una función incluida en todas las aplicaciones de cámara, pero no es fácil implementar esta función a la perfección. La razón es que la API de camera2 puede ser compleja de usar en algunos casos extremos y su comportamiento puede variar de un dispositivo a otro. Afortunadamente, PreviewView de la biblioteca Jetpack CameraX puede ayudarle a resolver este problema. PreviewView de la biblioteca Jetpack CameraX puede ayudarle a resolver este problema. Con una API estable, consistente y amigable para los desarrolladores para una variedad de dispositivos Android, mostrar vistas previas de la cámara ya no es un desafío.

PreviewView es una vista personalizada que muestra la pantalla de la cámara, diseñada para facilitar a los desarrolladores la configuración y el uso de la interfaz de vista previa de la cámara.

Si necesita proporcionar una funcionalidad básica para mostrar imágenes de la cámara en su aplicación, entonces usar PreviewView es el método más recomendado, que tiene las siguientes ventajas:

PreviewView es una subclase de FrameLayout. utilice SurfaceView o TextureView para mostrar la imagen capturada por la cámara. Una vez que la cámara está lista, crea una instancia de la superficie de vista previa y la mantiene el mayor tiempo posible mientras la cámara está en uso, y la recrea si la cámara libera la instancia de la superficie de vista previa antes de tiempo mientras está funcionando.

En términos de métricas clave como el consumo de energía y el tiempo de respuesta, SurfaceView es generalmente mejor que TextureView, razón por la cual PreviewView usa SurfaceView como modo de implementación predeterminado. Sin embargo, algunos dispositivos (principalmente los más antiguos) fallaron cuando la superficie de vista previa se lanzó prematuramente. Desafortunadamente, SurfaceView no tiene control sobre el tiempo de liberación de la superficie, ya que está controlado por la jerarquía de Vistas. Por lo tanto, en estos dispositivos, las vistas previas solo se pueden implementar usando TextureView. Si necesita rotar, cambiar la transparencia o animar la pantalla de vista previa de la cámara, también debe forzar que PreviewView use TextureView como modo de implementación.

Puede cambiar el modo de implementación de PreviewView llamando a PreviewView.setPreferredImplementationMode(ImplementationMode) y configurando el parámetro ImplementationMode en SURFACE_VIEW o TEXTURE_VIEW. Cuando el modo preferido está configurado en SURFACE_VIEW, la vista previa seguirá su configuración (usando SurfaceView) siempre que sea posible; cuando el modo preferido está configurado en TEXTURE_VIEW, la vista previa garantizará que siempre se use el modo TEXTURE_VIEW.

Antes de comenzar a usar PreviewView, asegúrese de configurar el modo que desea implementar llamando a Preview.setSurfaceProvider(PreviewView.createSurfaceProvider()).

A continuación se explica cómo configurar el modo de implementación de PreviewView:

PreviewView inicia el flujo de la imagen de vista previa manejando el SurfaceProvider necesario para crear el caso de uso de vista previa, que estará listo para ser proporcionada a la cámara en la vista previa Superficie utilizada. SurfaceProvider prepara la Superficie que se debe proporcionar a la cámara para mostrar el flujo de datos de la interfaz de vista previa y es responsable de recrear la Superficie si es necesario.

PreviewView.createSurfaceProvider(CameraInfo) recibe una instancia de CameraInfo que se puede borrar. La vista previa recibe los parámetros entrantes de CameraInfo, el modo de implementación establecido y las capacidades de la cámara actual, y determina cómo implementar esa funcionalidad internamente. Si pasa un CameraInfo vacío, la vista previa utilizará TextureView como modo de implementación porque no puede determinar si la cámara seleccionada funcionará correctamente con SurfaceView.

Una vez que haya creado el caso de vista previa y algunas otras instancias requeridas, vincúlelas al LifecycleOwner, cree un SurfaceProvider con CameraInfo de la cámara vinculada y vincúlelo al caso de vista previa, luego llame a Preview.setSurfaceProvider (SurfaceProvider) para iniciar el flujo de la pantalla de vista previa.

El siguiente ejemplo muestra cómo vincular una vista previa a una vista previa para habilitar el flujo de la pantalla de vista previa:

PreviewView proporciona una API que le permite controlar el estilo de la pantalla de vista previa

(Cómo) y su posición en la vista principal:

El resultado de combinar "cómo" y "dónde" representa los tipos de zoom admitidos por PreviewView, incluidos FIT_START, FIT_CENTER, FIT_END, FILL_START, FILL_CENTER y FILL_END, los más comunes son FIT_CENTER y FILL_END. FIT_CENTER y FILL_CENTER, el primero puede escalar la vista previa y centrarla mientras mantiene la relación de aspecto; el segundo no escala la vista previa y garantiza el centrado, pero puede hacer que la pantalla se recorte.

Hay dos formas de configurar la escala:

Para obtener la escala actual utilizada por la vista previa, llame a PreviewView.getScaleType().

Dependiendo de la orientación del sensor de la cámara, la rotación del dispositivo y el modo de visualización y la escala de vista previa, la vista previa puede escalar, rotar y traducir los fotogramas de vista previa recibidos de la cámara en consecuencia para mostrarse correctamente en la interfaz de usuario. . Por lo tanto, es importante convertir las coordenadas de la interfaz de usuario en coordenadas del sensor de la cámara. En CameraX, esta conversión la realiza MeteringPointFactory, que se puede crear a través de la API proporcionada por PreviewView: PreviewView.createMeteringPointFactory(cameraSelector), donde el parámetro CameraSelector representa la cámara a la que se pasarán los datos de transmisión.

Cuando necesite implementar la funcionalidad de enfoque por toque, MeteringPointFactor de PreviewView se lo pone fácil. Aunque el enfoque automático está habilitado de forma predeterminada en la vista previa de la cámara (requiere compatibilidad con la cámara), aún puedes controlar el objetivo de enfoque cuando tocas la vista previa. MeteringPointFactory convierte las coordenadas del objetivo de enfoque en las coordenadas del sensor de la cámara y luego usa la cámara para enfocar esa área.

El siguiente ejemplo muestra cómo utilizar oyentes táctiles para implementar hacer clic para hacer zoom en la vista previa:

Otra función comúnmente utilizada en las vistas previas de la cámara es el "zoom de pellizco", que Puede hacerlo mediante Pellizcar para acercar o alejar la vista previa. Para implementar esta funcionalidad en la vista previa, agregue un detector táctil en la parte superior de la vista previa y vincúlelo al detector de gestos de zoom. De esta manera puedes interceptar gestos táctiles y actualizar el zoom de la cámara en consecuencia.

El siguiente ejemplo muestra cómo implementar el zoom mediante pellizco en PreviewView:

PreviewView proporciona un comportamiento de manejo de cámara consistente en una variedad de dispositivos Android, gracias a CameraX en PreviewView y más allá del laboratorio de pruebas automatizado. ejecutándose en API. PreviewView y otras API en laboratorios de pruebas automatizados. Estas pruebas se dividen en dos categorías principales:

Resumen:

¿Quiere obtener más información sobre las increíbles funciones de CameraX? Revise la siguiente información y lecturas recomendadas:

Si tiene preguntas sobre PreviewView o las vistas previas, no dude en dejar un comentario a continuación. ¡Gracias por leer!

Haz clic aquí para obtener más información sobre CameraX.

/footer>