При добавлении предварительного просмотра в приложение используйте 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:
Kotlin
import androidx.camera.lifecycle.ProcessCameraProvider import com.google.common.util.concurrent.ListenableFuture class MainActivity : AppCompatActivity() { private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider> override fun onCreate(savedInstanceState: Bundle?) { cameraProviderFuture = ProcessCameraProvider.getInstance(this) } }
Java
import androidx.camera.lifecycle.ProcessCameraProvider import com.google.common.util.concurrent.ListenableFuture public class MainActivity extends AppCompatActivity { private ListenableFuture<ProcessCameraProvider> cameraProviderFuture; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { cameraProviderFuture = ProcessCameraProvider.getInstance(this); } }
Проверьте доступность CameraProvider
После запроса CameraProvider убедитесь, что инициализация прошла успешно, когда представление создано. Ниже показано, как это сделать.
Kotlin
cameraProviderFuture.addListener(Runnable { val cameraProvider = cameraProviderFuture.get() bindPreview(cameraProvider) }, ContextCompat.getMainExecutor(this))
Java
cameraProviderFuture.addListener(() -> { try { ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); bindPreview(cameraProvider); } catch (ExecutionException | InterruptedException e) { // No errors need to be handled for this Future. // This should never be reached. } }, ContextCompat.getMainExecutor(this));
Пример использования функции bindPreview приведен в следующем разделе.
Выберите камеру и привяжите жизненный цикл и способы использования
После того как вы создадите и подтвердите CameraProvider, выполните следующие действия:
- Создайте
Preview. - Выберите нужный вариант камеры
LensFacing. - Привяжите выбранную камеру и все варианты использования к жизненному циклу.
- Подключите
PreviewкPreviewView.
Пример кода:
Kotlin
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) }
Java
void bindPreview(@NonNull ProcessCameraProvider cameraProvider) { Preview preview = new Preview.Builder() .build(); CameraSelector cameraSelector = new CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build(); preview.setSurfaceProvider(previewView.getSurfaceProvider()); Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview); }
Обратите внимание, что bindToLifecycle() возвращает объект Camera. Подробнее о настройках камеры, таких как масштаб и экспозиция…
Вы завершили реализацию предварительного просмотра с камеры. Создайте приложение и убедитесь, что предварительный просмотр работает правильно.
Дополнительные элементы управления для PreviewView
CameraX PreviewView предоставляет дополнительные API для настройки таких свойств, как:
- Режим реализации для отрисовки предварительного просмотра.
- Тип масштабирования изображения для предварительного просмотра.
Режим реализации
PreviewView может использовать один из следующих режимов для рендеринга потока предварительного просмотра в целевом объекте View:
PERFORMANCE– режим по умолчанию.PreviewViewиспользуетSurfaceViewдля показа видеопотока, но в некоторых случаях переключается наTextureView.SurfaceViewимеет выделенную поверхность для рисования, которая с большей вероятностью будет реализована с аппаратным оверлеем с помощью внутреннего аппаратного композитора, особенно если поверх видео предварительного просмотра нет других элементов пользовательского интерфейса (например, кнопок). При отрисовке с аппаратным оверлеем кадры видео не проходят через графический процессор, что может снизить энергопотребление и задержку.COMPATIBLE. В этом режимеPreviewViewиспользуетTextureView, у которого, в отличие отSurfaceView, нет выделенной поверхности для рисования. В результате видео отображается со смешиванием. На этом этапе приложение может выполнять дополнительную обработку, например масштабировать и поворачивать видео без ограничений.
Используйте PreviewView.setImplementationMode(), чтобы выбрать режим реализации, подходящий для вашего приложения. Если режим PERFORMANCE по умолчанию не подходит для вашего приложения, в примере кода ниже показано, как задать режим COMPATIBLE:
Kotlin
// 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:
Kotlin
// 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 1080 из центра масштабированного видео 1920 x 1440. Верхние и нижние 180 строк видео не видны. - Для
FILL_STARTобрежьте видео 1920 x 1440 до 1920 x 1080, начиная с начала. Нижние 360 строк видео не видны. - Для
FILL_ENDобрежьте видео с разрешением 1920 x 1440 до 1920 x 1080 с конца. Верхние 360 строк видео не видны.
- Для
Дополнительные ресурсы
Чтобы узнать больше о CameraX, ознакомьтесь со следующими дополнительными ресурсами.
Практическая работа
Пример кода