Добавляя предварительный просмотр в приложение, используйте PreviewView – это View, который можно обрезать, масштабировать и поворачивать для правильного отображения.
Когда камера становится активной, изображение с нее передается на поверхность внутри PreviewView.
Как использовать PreviewView
Чтобы реализовать предварительный просмотр для CameraX с помощью PreviewView, выполните следующие действия, которые описаны в следующих разделах:
- При необходимости настройте
CameraXConfig.Provider. - Добавьте
PreviewViewв макет. - Запросите
ProcessCameraProvider. - При создании
ViewпроверьтеProcessCameraProvider. - Выберите камеру и привяжите жизненный цикл и способы использования.
При использовании PreviewView действуют некоторые ограничения. При использовании PreviewView вы не можете:
- Создайте
SurfaceTexture, чтобы задатьTextureViewиPreview.SurfaceProvider. - Получите
SurfaceTextureизTextureViewи задайте его вPreview.SurfaceProvider. - Возьмите
SurfaceизSurfaceViewи установите наPreview.SurfaceProvider.
В любом из этих случаев Preview прекращает передачу кадров на PreviewView.
Добавьте PreviewView в макет
Ниже приведен пример макета с элементом PreviewView.
<FrameLayout android:id="@+id/container"> <androidx.camera.view.PreviewView android:id="@+id/previewView" /> </FrameLayout>
Запрос CameraProvider
В следующем примере кода показано, как запросить CameraProvider:
// import androidx.camera.lifecycle.ProcessCameraProvider // import com.google.common.util.concurrent.ListenableFuture class MainActivity : ComponentActivity() { private lateinit var cameraProviderFuture: ListenableFuture<ProcessCameraProvider> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) cameraProviderFuture = ProcessCameraProvider.getInstance(this) } }
Проверьте доступность CameraProvider
После запроса CameraProvider убедитесь, что инициализация прошла успешно, когда представление создано. Ниже показано, как это сделать.
cameraProviderFuture.addListener( Runnable { val cameraProvider = cameraProviderFuture.get() bindPreview(cameraProvider) }, ContextCompat.getMainExecutor(this) )
Пример использования функции bindPreview приведен в следующем разделе.
Выберите камеру и привяжите жизненный цикл и способы использования
После того как вы создадите и подтвердите CameraProvider, выполните следующие действия:
- Создайте
Preview. - Выберите нужный вариант камеры
LensFacing. - Привяжите выбранную камеру и все варианты использования к жизненному циклу.
- Подключите
PreviewкPreviewView.
Пример кода:
fun bindPreview(cameraProvider: ProcessCameraProvider) { var preview: Preview = Preview.Builder() .build() var cameraSelector: CameraSelector = CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build() preview.setSurfaceProvider(previewView.getSurfaceProvider()) var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview) }
Обратите внимание, что bindToLifecycle() возвращает объект Camera. Подробнее о настройках камеры, таких как масштаб и экспозиция…
Вы завершили реализацию предварительного просмотра камеры. Создайте приложение и убедитесь, что предварительный просмотр работает так, как вы планировали.
Дополнительные элементы управления для PreviewView
В CameraX PreviewView есть дополнительные API для настройки таких свойств, как:
- Режим реализации для отрисовки потоков предварительного просмотра.
- Тип масштабирования изображения для предварительного просмотра.
Режим реализации
PreviewView может использовать один из следующих режимов для рендеринга потока предварительного просмотра на целевом объекте View:
PERFORMANCE– режим по умолчанию. Для показа видеопотокаPreviewViewиспользуетSurfaceView, но в некоторых случаях переключается наTextureView.SurfaceViewимеет выделенную поверхность для рисования, которая с большей вероятностью будет реализована с аппаратным наложением с помощью внутреннего аппаратного компоновщика, особенно когда поверх видео предварительного просмотра нет других элементов пользовательского интерфейса (например, кнопок). При отрисовке с аппаратным оверлеем кадры видео не проходят через графический процессор, что может снизить энергопотребление и задержку.COMPATIBLE. В этом режимеPreviewViewиспользуетTextureView, у которого, в отличие отSurfaceView, нет выделенной поверхности для рисования. В результате видео отображается со смешиванием. На этом этапе приложение может выполнять дополнительную обработку, например масштабирование и поворот видео без ограничений.
Используйте PreviewView.setImplementationMode(), чтобы выбрать режим реализации, подходящий для вашего приложения. Если режим по умолчанию PERFORMANCE не подходит для вашего приложения, вы можете задать режим COMPATIBLE, как показано в примере кода ниже.
// viewFinder is a PreviewView instance. viewFinder.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
Тип шкалы
Если разрешение видео в предварительном просмотре отличается от размеров целевого устройства PreviewView, видеоконтент необходимо подогнать под размер экрана, обрезав его или добавив черные полосы (сохранив исходное соотношение сторон). Для этого в PreviewView предусмотрены следующие ScaleTypes:
FIT_CENTER,FIT_STARTиFIT_ENDдля кашетирования. Видеоконтент масштабируется (увеличивается или уменьшается) до максимально возможного размера, который может быть показан в целевом объектеPreviewView. Однако, хотя кадр видео виден полностью, часть экрана может быть пустой. В зависимости от выбранного типа масштабирования кадр видео выравнивается по центру, началу или концу целевого представления.FILL_CENTER,FILL_START,FILL_ENDдля кадрирования. Если соотношение сторон видео не равноPreviewView, то видна только часть контента, но видео заполняет весь экранPreviewView.
По умолчанию CameraX использует тип масштабирования FILL_CENTER. Используйте PreviewView.setScaleType(), чтобы задать тип масштабирования, наиболее подходящий для вашего приложения. В следующем примере кода задается тип масштабирования FIT_CENTER:
// viewFinder is a PreviewView instance. viewFinder.scaleType = PreviewView.ScaleType.FIT_CENTER
Процесс показа видео состоит из следующих этапов:
- Чтобы изменить масштаб видео:
- Для типов масштабирования
FIT_*масштабируйте видео с помощьюmin(dst.width/src.width, dst.height/src.height). - Для типов масштабирования
FILL_*масштабируйте видео с помощьюmax(dst.width/src.width, dst.height/src.height).
- Для типов масштабирования
- Выровняйте масштабированное видео по целевому объекту
PreviewView:- Для
FIT_CENTER/FILL_CENTERвыровняйте по центру масштабированное видео и целевой элементPreviewView. - Для
FIT_START/FILL_STARTвыровняйте масштабированное видео и целевую областьPreviewViewпо верхнему левому углу. - Для
FIT_END/FILL_ENDвыровняйте масштабированное видео и целевую областьPreviewViewпо их правому нижнему углу.
- Для
Например, у вас есть исходное видео размером 640 x 480 и целевое видео размером 1920 x 1080.
PreviewView

На изображении ниже показан процесс масштабирования FIT_START / FIT_CENTER / FIT_END.

Вот как это работает:
- Масштабируйте кадр видео (сохраняя исходное соотношение сторон) с помощью
min(1920/640, 1080/480) = 2.25, чтобы получить промежуточный кадр видео размером 1440 x 1080. - Выровняйте кадр видео 1440 x 1080 по кадру 1920 x 1080
PreviewView.- Для
FIT_CENTERвыровняйте кадр видео по центру окнаPreviewView. Первые и последние 240 пикселей столбцовPreviewViewдолжны быть пустыми. - Для
FIT_STARTвыровняйте кадр видео по началу (левому верхнему углу) окнаPreviewView. Последние 480 пикселей столбцовPreviewViewпустые. - Для
FIT_ENDвыровняйте кадр видео по концу (правому нижнему углу) окнаPreviewView. Первые 480 пикселей столбцовPreviewViewпустые.
- Для
На изображении ниже показан процесс масштабирования FILL_START / FILL_CENTER / FILL_END.

Вот как это работает:
- Масштабируйте кадр видео с помощью
max(1920/640, 1080/480) = 3, чтобы получить промежуточный кадр видео размером 1920 x 1440 (что больше размераPreviewView). - Кадрируйте видео 1920 x 1440, чтобы оно помещалось в окно
PreviewView1920 x 1080.- Для
FILL_CENTERобрежьте видео 1920 x 1440 до 1920 x 1080, начиная от центра. Верхние и нижние 180 строк видео не видны. - Для
FILL_STARTобрежьте видео с разрешением 1920 x 1440 до 1920 x 1080, начиная с начала. Нижние 360 строк видео не видны. - Для
FILL_ENDобрежьте 1920 x 1080 с конца масштабированного видео 1920 x 1440. Верхние 360 строк видео не видны.
- Для
Дополнительные ресурсы
Чтобы узнать больше о CameraX, ознакомьтесь со следующими дополнительными ресурсами.
Практическая работа
Пример кода