В настоящее время я делаю плеер с 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 отображает его правильно:
порезы телефон с большим количеством изображения, несмотря на позиционирование его правильно. Это заставляет меня поверить, что нижняя часть не отображается там, где на старых устройствах она есть. Может ли кто-нибудь подтвердить это и указать мне в правильном положении, чтобы исправить эту проблему?