Implemented pinch to zoom for reading EPC QR Codes
This commit is contained in:
parent
1228b6884d
commit
052ee9c7e5
|
@ -1,6 +1,7 @@
|
||||||
package net.codinux.banking.ui.service
|
package net.codinux.banking.ui.service
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
|
import android.view.ScaleGestureDetector
|
||||||
import androidx.camera.core.*
|
import androidx.camera.core.*
|
||||||
import androidx.camera.lifecycle.ProcessCameraProvider
|
import androidx.camera.lifecycle.ProcessCameraProvider
|
||||||
import androidx.camera.view.PreviewView
|
import androidx.camera.view.PreviewView
|
||||||
|
@ -50,7 +51,6 @@ actual object QrCodeService {
|
||||||
AndroidView(factory = { previewView }, modifier = Modifier.fillMaxSize())
|
AndroidView(factory = { previewView }, modifier = Modifier.fillMaxSize())
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
|
||||||
private fun setupCameraView(previewView: PreviewView, mainActivity: MainActivity, resultCallback: (QrCodeReadResult) -> Unit) {
|
private fun setupCameraView(previewView: PreviewView, mainActivity: MainActivity, resultCallback: (QrCodeReadResult) -> Unit) {
|
||||||
val cameraProviderFuture = ProcessCameraProvider.getInstance(mainActivity)
|
val cameraProviderFuture = ProcessCameraProvider.getInstance(mainActivity)
|
||||||
|
|
||||||
|
@ -79,8 +79,9 @@ actual object QrCodeService {
|
||||||
cameraProvider.unbindAll()
|
cameraProvider.unbindAll()
|
||||||
|
|
||||||
// Bind use cases to camera
|
// Bind use cases to camera
|
||||||
cameraProvider.bindToLifecycle(mainActivity, cameraSelector, preview, imageAnalyzer)
|
val camera = cameraProvider.bindToLifecycle(mainActivity, cameraSelector, preview, imageAnalyzer)
|
||||||
|
|
||||||
|
configureCameraControl(camera, previewView, mainActivity)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
log.error(e) { "Use case binding failed" }
|
log.error(e) { "Use case binding failed" }
|
||||||
}
|
}
|
||||||
|
@ -88,6 +89,35 @@ actual object QrCodeService {
|
||||||
}, ContextCompat.getMainExecutor(mainActivity))
|
}, ContextCompat.getMainExecutor(mainActivity))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun configureCameraControl(
|
||||||
|
camera: Camera,
|
||||||
|
previewView: PreviewView,
|
||||||
|
mainActivity: MainActivity
|
||||||
|
) {
|
||||||
|
// Listen to pinch gestures
|
||||||
|
val listener = object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
|
||||||
|
override fun onScale(detector: ScaleGestureDetector): Boolean {
|
||||||
|
// Get the camera's current zoom ratio
|
||||||
|
val currentZoomRatio = camera.cameraInfo.zoomState.value?.zoomRatio ?: 0F
|
||||||
|
|
||||||
|
// Get the pinch gesture's scaling factor
|
||||||
|
val delta = detector.scaleFactor
|
||||||
|
|
||||||
|
// Update the camera's zoom ratio. This is an asynchronous operation that returns
|
||||||
|
// a ListenableFuture, allowing you to listen to when the operation completes.
|
||||||
|
camera.cameraControl.setZoomRatio(currentZoomRatio * delta)
|
||||||
|
|
||||||
|
return true // Return true, as the event was handled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val scaleGestureDetector = ScaleGestureDetector(mainActivity, listener)
|
||||||
|
|
||||||
|
previewView.setOnTouchListener { _, event ->
|
||||||
|
scaleGestureDetector.onTouchEvent(event)
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue