开启成长之旅!这是我参加「日新计划 2 月更文应战」的第 29 天,点击检查活动概况

前言

PreviewView是归于CameraX组件的内容,也是咱们的Jetpack库中的组件内容,咱们可以用PreviewView去实现预览咱们的相机画面。

正文

为什么运用CameraX?

这点官方现已告诉了咱们:

安卓开发控件学习——使用 PreviewView预览相机画面

接下来咱们将运用它的预览视图PreviewView,看看它的作用。

安卓开发控件学习——使用 PreviewView预览相机画面
咱们用Kotlin言语开发,由于用到摄像头,所以需求摄像头权限,首要就需求去把咱们的摄像头权限注册到清单文件:

安卓开发控件学习——使用 PreviewView预览相机画面

代码如下:

<uses-permission android:name="android.permission.CAMERA"/>

以及需求在setting.gradle文件中参加咱们的google()(有些创立项目形式自带):

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

接着咱们在app目录的build.gradle文件中的android块中参加下面代码(有些创立项目形式自带):

android {
    ....
    ....
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

接着把咱们需求的CameraX依赖导入咱们模块里(这儿是app/build.gradle):

dependencies {
    ....
    // The following line is optional, as the core library is included indirectly by camera-camera2
    implementation 'androidx.camera:camera-core:1.3.0-alpha04'
    implementation 'androidx.camera:camera-camera2:1.3.0-alpha04'
    // If you want to additionally use the CameraX Lifecycle library
    implementation 'androidx.camera:camera-lifecycle:1.3.0-alpha04'
    // If you want to additionally use the CameraX VideoCapture library
    implementation 'androidx.camera:camera-video:1.3.0-alpha04'
    // If you want to additionally use the CameraX View class
    implementation 'androidx.camera:camera-view:1.3.0-alpha04'
    // If you want to additionally add CameraX ML Kit Vision Integration
    implementation 'androidx.camera:camera-mlkit-vision:1.3.0-alpha04'
    // If you want to additionally use the CameraX Extensions library
    implementation 'androidx.camera:camera-extensions:1.3.0-alpha04'
}

版别用最新的即可。

看了官方的说明,CameraX的功用太丰富了,有空还得仔细看,言归正传,咱们回到 PreviewView上,接下来咱们把布局给安置好:

<FrameLayout
    android:id="@+id/container"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
    <androidx.camera.view.PreviewView
        android:id="@+id/previewView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</FrameLayout>

然后在Activity中构建相应代码与装备:
第一步恳求CameraProvider:

private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        ....
        ....
        //恳求CameraProvider
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    }

接着咱们去动态恳求摄像机权限(这块代码咱们下一篇聊,这儿咱们先在app的设置权限里给相机权限授权运用中允许),然后去添加CameraProvider监听去创立预览

cameraProviderFuture.addListener({
    val cameraProvider = cameraProviderFuture.get()
    bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(this))

咱们用bindPreview()方法创立预览和相关装备与绑定流程:

private fun bindPreview(cameraProvider : ProcessCameraProvider) {
    val imageCapture = ImageCapture.Builder().build()
    //创立preview
    val preview : Preview = Preview.Builder()
        .build()
    //创立装备
    val cameraSelector : CameraSelector = CameraSelector.Builder()
        //后置相机(指定镜头)
        .requireLensFacing(CameraSelector.LENS_FACING_BACK)
        .build()
    //preview绑定previewView
    preview.setSurfaceProvider(binding.previewView.surfaceProvider)
    //将选择的相机和装备用例与生命周期绑定
    cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview, imageCapture)
}

运行程序,咱们就能得到下面的作用:

安卓开发控件学习——使用 PreviewView预览相机画面

可以看到咱们成功的将后置摄像机镜头画面预览在咱们的app页面上。

总结

其实CameraX的功用很多,从拍照到视频都能自定义,甚至还能指定镜头数量,有空可以多看看运用的方法,后面再出一篇。