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() // 切换相机方向后重新启动相机预览
}
}
Android kotlin 相机预览,前后切换,动画显示代码
于 2025-02-13 09:28:57 首次发布