При определении размера предварительного просмотра вам необходимо учитывать ориентацию. Например, getOptimalPreviewSize()
от ApiDemos не обращает внимания на ориентацию, просто потому, что их версия этого приложения имеет ориентацию, привязанную к ландшафту. Если вы хотите, чтобы ориентация плавала, вам нужно изменить целевой формат изображения для соответствия. Итак, где getOptimalPreviewSize()
имеет этот
double targetRatio=(double)width/height;
И
if (displayOrientation == 90 || displayOrientation == 270) {
targetRatio=(double)height/width;
}
где displayOrientation
это значение от 0 до 360, что я Определяя из около 100 строк какого-то серьезно уродливого кода, поэтому я обертывая все это в повторно используемый компонент, который я опубликую в ближайшее время.
Во-вторых, вы должны учитывать эту ориентацию дисплея при управлении соотношением сторон используемого вами/TextureView
. CameraPreview
деятельности от ApiDemos
имеет свой собственный просмотр ViewGroup
, который обрабатывает соотношение сторон, и вы должны полностью изменить соотношение сторон для использования в портретном:
if (displayOrientation == 90
|| displayOrientation == 270) {
previewWidth=mPreviewSize.height;
previewHeight=mPreviewSize.width;
}
else {
previewWidth=mPreviewSize.width;
previewHeight=mPreviewSize.height;
}
где displayOrientation
это то же самое значение (90 и 270 портретных и обратный портрет соответственно, и обратите внимание, что я не пробовал работать с обратным портретом или обратным пейзажем, поэтому может потребоваться больше настроек).
В-третьих - вы должны начать предварительный просмотр перед вызовом setPictureSize()
на Camera.Parameters
. В противном случае, как будто пропорции изображения применяются к кадрам предварительного просмотра, закручивая вещи вверх.
Camera.Parameters parameters=camera.getParameters();
Camera.Size pictureSize=getHost().getPictureSize(parameters);
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
camera.setParameters(parameters);
camera.startPreview();
parameters=camera.getParameters();
parameters.setPictureSize(pictureSize.width, pictureSize.height);
parameters.setPictureFormat(ImageFormat.JPEG);
camera.setParameters(parameters);
Это ничего не помогло мне – Jill
вам нужно использовать params.set («rotation», 90); insted of setDisplayOrientation –
Yup, я сделал это. Он ничего не делал, пока setDisplayOrientation что-то сделал. – Jill