Android kotlin 相机预览,前后切换,动画显示代码

package com.example.camerawatermark.camera

import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.AspectRatio
import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageCapture
import androidx.camera.core.Preview
import androidx.camera.core.resolutionselector.AspectRatioStrategy
import androidx.camera.core.resolutionselector.ResolutionSelector
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.video.Quality
import androidx.camera.video.QualitySelector
import androidx.camera.video.Recorder
import androidx.camera.video.VideoCapture
import androidx.core.content.ContextCompat
import com.example.camerawatermark.databinding.CameraBinding


@SuppressLint("ClickableViewAccessibility")
class CameraSettingsModule(private val context: AppCompatActivity, private val binding: CameraBinding) {

    private var currentCameraLensFacing = CameraSelector.LENS_FACING_BACK

    init {
        // 在类初始化时请求相机权限并启动相机
        startCamera()

        binding.btnSwitchCamera.setOnClickListener{
            // 添加翻转动画
            val flipAnimator = ObjectAnimator.ofFloat(binding.btnSwitchCamera, View.ROTATION_Y, 0f, 360f)
            flipAnimator.duration = 500 // 设置动画持续时间
            flipAnimator.start()
            toggleCamera()
        }
    }

    private fun startCamera() {
        val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
        cameraProviderFuture.addListener({
            cameraProvider = cameraProviderFuture.get()

            val cameraSelector = if (currentCameraLensFacing == CameraSelector.LENS_FACING_BACK) {
                CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
            } else {
                CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_FRONT).build()
            }


            val preview = Preview.Builder()
//                .setResolutionSelector(
//                    ResolutionSelector.Builder()
//                        .setAspectRatioStrategy(AspectRatioStrategy(AspectRatio.RATIO_4_3, AspectRatioStrategy.FALLBACK_RULE_AUTO))
//                        .build()
//                )
                .build()
            // 將 surfaceProvider 繫結至 preview 用例來啟動預覽
            preview.setSurfaceProvider(binding.previewView.surfaceProvider)

            imageAnalysis = ImageAnalysis.Builder()
                .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                .build()

            imageCapture = ImageCapture.Builder().build()

            val recorder = Recorder.Builder()
                .setQualitySelector(QualitySelector.from(Quality.FHD))
                .build()

            videoCapture = VideoCapture.withOutput(recorder)

            // 解绑所有用例
            cameraProvider.unbindAll()

            // 绑定相机使用新的 CameraSelector 和预览配置
            camera = cameraProvider.bindToLifecycle(context, cameraSelector, preview,
                imageAnalysis, imageCapture, videoCapture)


        }, ContextCompat.getMainExecutor(context))
    }

    // 这个函数用来切换相机朝向
    private fun toggleCamera() {
        currentCameraLensFacing = if (currentCameraLensFacing == CameraSelector.LENS_FACING_BACK) {
            CameraSelector.LENS_FACING_FRONT
        } else {
            CameraSelector.LENS_FACING_BACK
        }

        startCamera() // 切换相机方向后重新启动相机预览
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔兽-SS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值