Я пытаюсь, чтобы предварительный просмотр камеры работал правильно в портретном режиме, когда самой активности разрешено нормально менять ориентацию (т.е. не быть заблокированной для пейзажа).
Использование setDisplayOrientation()
серьезно нарушает поведение превью.
Это может продемонстрировать Google собственный ApiDemos. Первое изображение основано на CameraPreview
из версии android-17
проекта образца ApiDemos
, где единственным изменением, которое я сделал, было удаление android:orientation="landscape"
из этой записи активности в манифесте. Следующее изображение представляет собой скриншот того, что появляется на дисплее Nexus 4, работающего под управлением Android 4.2, при этом камера указала на 8,5-дюймовый квадрат бумаги:
Что не очевидно из этого предварительного просмотра, так это то, что он поворачивается на 90 градусов. Носки, одетые в носок, которые вы видите в крайнем правом углу изображения, были фактически ниже квадрата.
Решение для этого, по крайней мере для ландшафтного режима, заключается в использовании setDisplayOrientation()
. Но если вы измените внутренний класс Preview
CameraPreview
на mCamera.setDisplayOrientation(90);
, вы получите следующее:
Примечательно, что квадрат больше не квадрат.
В этом случае используется тот же размер SurfaceView
, что и раньше. Я воспроизвел этот сценарий с каким-то другим кодом, вне ApiDemos
, и я получаю то же поведение с TextureView
в этом коде.
Я кратко подумал, что проблема может заключаться в том, что getSupportedPreviewSizes()
может возвращать разные значения на основе setDisplayOrientation()
, но быстрый тест предполагает, что это не так.
Кто-нибудь знает, как заставить setDisplayOrientation()
работать в портретном режиме, не нарушая пропорции изображений, перенесенных на предварительный просмотр?
Спасибо!