Итак, у меня есть класс, который расширяет SurfaceView и переопределяет
surfaceChanged - просто вызывает startPreview
surfaceCreated - открывает камеру, редактирует параметры *, устанавливает surfaceHolder
surfaceDestroyed - вызывает stopPreview, освобождает камеру
все это отлично работает, потому что ориентация - портрет:
from surfaceCreated *
m_camera = Camera.open();
Camera.Parameters p = m_camera.getParameters();
if (getResources().getConfiguration().orientation !=
Configuration.ORIENTATION_LANDSCAPE)
{
p.set("orientation", "portrait");
// CameraApi is a wrapper to check for backwards compatibility
if (CameraApi.isSetRotationSupported())
{
CameraApi.setRotation(p, 90);
}
}
Однако при каждом изменении ориентации он вызывает Camera.open()... который, как вы знаете, довольно дорогостоящая операция, в результате чего переходы становятся не столь гладкими.
Когда я нажимаю ориентацию на пейзаж, предварительный просмотр велик. Создать только получает вызов один раз, который работает, потому что предварительный просмотр в ландшафте, камера всегда то, что видит пользователь. Тем не менее, мне нужен способ установить ориентацию фактического снимка, сделанного в портрете. Однако, когда я заставляю пейзаж, поверхность никогда не воссоздается, и параметры никогда не устанавливаются, когда камера удерживается в портрете.
Итак, как я могу сделать одно из следующих (исключительно)?
-
Удерживайте m_camera между onDestroy и onCreate, когда ориентация меняется, чтобы переход был плавным.
-
Применить ландшафт и определить изменения ориентации другим способом... вращение окончательного снимка при сохранении в портрете.
Кроме того, если я покинул базу, кто-то может указать мне в лучшем направлении? Спасибо.