Это класс AutoFitTextView
, который я извлек из примера Google.Вы можете посмотреть на здесь .Он нацелен на то, чтобы показать вид с камеры и сконфигурировать базу соотношения физических размеров устройства.
public class AutoFitTextureView extends TextureView {
private int mRatioWidth = 0;
private int mRatioHeight = 0;
// Some codes here...
public void setAspectRatio(int width, int height) {
if (width < 0 || height < 0) {
throw new IllegalArgumentException("Size cannot be negative.");
}
mRatioWidth = width;
mRatioHeight = height;
requestLayout();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if (0 == mRatioWidth || 0 == mRatioHeight) {
setMeasuredDimension(width, height);
} else {
if (width < height * mRatioWidth / mRatioHeight) {
setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
} else {
setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
}
}
}
}
В этом классе есть 2 пункта:
- Невозможно обеспечить правильное соотношение в каждом устройстве .Однако мы можем выбрать оптимизированный размер, который уже определен в этом классе .
- Это неправильное условие:
if (width < height * mRatioWidth / mRatioHeight)
.Это должно быть > , потому что когда ширина больше высоты, мы вычисляем и устанавливаем размер измерения на основе ширины (не высоты).
ОБНОВЛЕНО
Если вы просто хотите, чтобы каждое устройство работало должным образом в определенном соотношении, установите для него жесткое соотношение (например: 4/3)
Этого можно добиться, заменив эти строки кода:
mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class),
rotatedPreviewWidth, rotatedPreviewHeight, maxPreviewWidth,
maxPreviewHeight, largest);
-> previewSize = Size(4, 3)