TextureView TranslationX & Y comportamiento no esperado en API 23

Actualmente estoy haciendo un reproductor de cámara con un textureview para hacer mi cámara. Debido a que la vista previa puede tener cualquier dimensión he creado algún código personalizado para alterar la textura cuando OnSurfaceTextureUpdated se llama:

  void updateTextureMatrix(int width, int height) { Display display = WindowManager.DefaultDisplay; var isPortrait = (display.Rotation == SurfaceOrientation.Rotation0 || display.Rotation == SurfaceOrientation.Rotation180); int previewWidth = orgPreviewWidth; int previewHeight = orgPreviewHeight; if(isPortrait) { previewWidth = orgPreviewHeight; previewHeight = orgPreviewWidth; } // determine which part to crop float widthRatio = (float)width / previewWidth; float heightRatio = (float)height / previewHeight; float scaleX; float scaleY; if(widthRatio > heightRatio) { // height must be cropped scaleX = 1; scaleY = widthRatio * ((float)previewHeight / height); } else { // width must be cropped scaleX = heightRatio * ((float)previewWidth / width); scaleY = 1; } Android.Graphics.Matrix matrix = new Android.Graphics.Matrix(); matrix.SetScale(scaleX, scaleY); _textureView.SetTransform(matrix); float scaledWidth = width * scaleX; float scaledHeight = height * scaleY; float dx = (width - scaledWidth) * 0.5f; float dy = (height - scaledHeight) * 0.5f; _textureView.TranslationX = dx; _textureView.TranslationY = dy; } 

La escala y cálculo de dx & dy funcionan perfectamente bien en los dispositivos Android más antiguos, pero los dispositivos que tengo a mi disposición con el nivel 23 de la API lanzan un comportamiento inesperado.

La galaxia S3 lo muestra correctamente: Galaxy s3

Pero en la S7: S7

El teléfono corta una gran parte de la imagen, a pesar de posicionarlo correctamente. Esto me hace creer que la parte inferior no se está haciendo donde en los dispositivos más antiguos que es. ¿Puede alguien confirmar esto y señalarme en la posición correcta para solucionar este problema?

Después de largas pruebas descubrí que el problema se debía al método SetTransform . Estaba ajustando mi escala usando la matriz pero esto de alguna manera rendía mi textura e ignoraba TranslationX & TranslationY . Quitar la matriz y reemplazarla por float scaledWidth = width * scaleX; Float scaledHeight = altura * scaleY;

  float dx = (width - scaledWidth) * 0.5f; float dy = (height - scaledHeight) * 0.5f; _textureView.ScaleX = scaleX; _textureView.ScaleY = scaleY; _textureView.TranslationX = dx; _textureView.TranslationY = dy; 

Arreglado mi problema de renderizar incorrectamente en ciertos dispositivos android.

  • La cantidad "dos" no funciona en Android Strings-Resources Plural
  • Cómo aplicar mediante programación simultáneamente translate & scale animation en una vista
  • Android simular pulsaciones de teclas
  • Android drawText incluyendo el texto que envuelve
  • De arriba a abajo - traducir animación
  • Obtener la coordenada Y de la parte superior e inferior de ImageView
  • ¿Cómo traduce su aplicación para Android?
  • ¿Cambia el nombre de la aplicación en Google Play Store según el idioma del teléfono del usuario?
  • Cambiar la configuración regional, pero mantener orientaciones de izquierda a derecha y de otros teléfonos
  • Error al analizar datos org.json.JSONException: El valor <br del tipo java.lang.String no se puede convertir en JSONObject
  • Cómo hacer animación de traducción para cada elemento de vista de lista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.