2017-02-07 2 views
5

В настоящее время я делаю плеер с textureview для рендеринга моей камеры. Поскольку просмотр может иметь любой размер, я создал пользовательский код, чтобы изменить textureview когда OnSurfaceTextureUpdated называется:TextureView TranslationX & Y ожидаемое поведение по API 23

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; 
    } 

скейлинговым & расчет dx & dy работы прекрасно на старых андроид устройств, но устройства я имею в мое удаление с API-уровнем 23 вызывает неожиданное поведение.

Галактика S3 отображает его правильно: Galaxy S3

Но на S7: S7

порезы телефон с большим количеством изображения, несмотря на позиционирование его правильно. Это заставляет меня поверить, что нижняя часть не отображается там, где на старых устройствах она есть. Может ли кто-нибудь подтвердить это и указать мне в правильном положении, чтобы исправить эту проблему?

ответ

4

После долгих испытаний я выяснил, что выпуск был вызван методом SetTransform. Я устанавливал свою шкалу, используя матрицу, но это как-то визуализировало мою текстуру & проигнорировал TranslationX & TranslationY. Снятие матрицы & с заменой на float scaledWidth = width * scaleX; float scaledHeight = height * 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; 

Исправлена ​​ошибка, связанная с неправильным отображением некоторых устройств Android.

Смежные вопросы