86dd703c2b
* First Android rewrite * Rewrite Android C++ backend * Pass `ReadableNativeMap`, fix build error * fix: Fix FrameProcessor init * Make a bunch of stuff const reference to avoid copies * Indents * Cleanup * indents * docs: Update Android docs * Update CameraView.kt * fix: Format C++ code
30 lines
1.1 KiB
Kotlin
30 lines
1.1 KiB
Kotlin
package com.mrousavy.camera
|
|
|
|
import androidx.camera.core.FocusMeteringAction
|
|
import com.facebook.react.bridge.ReadableMap
|
|
import kotlinx.coroutines.guava.await
|
|
import kotlinx.coroutines.withContext
|
|
import java.util.concurrent.TimeUnit
|
|
|
|
suspend fun CameraView.focus(pointMap: ReadableMap) {
|
|
val cameraControl = camera?.cameraControl ?: throw CameraNotReadyError()
|
|
if (!pointMap.hasKey("x") || !pointMap.hasKey("y")) {
|
|
throw InvalidTypeScriptUnionError("point", pointMap.toString())
|
|
}
|
|
|
|
val dpi = resources.displayMetrics.density
|
|
val x = pointMap.getDouble("x") * dpi
|
|
val y = pointMap.getDouble("y") * dpi
|
|
|
|
// Getting the point from the previewView needs to be run on the UI thread
|
|
val point = withContext(coroutineScope.coroutineContext) {
|
|
previewView.meteringPointFactory.createPoint(x.toFloat(), y.toFloat())
|
|
}
|
|
|
|
val action = FocusMeteringAction.Builder(point, FocusMeteringAction.FLAG_AF or FocusMeteringAction.FLAG_AE)
|
|
.setAutoCancelDuration(5, TimeUnit.SECONDS) // auto-reset after 5 seconds
|
|
.build()
|
|
|
|
cameraControl.startFocusAndMetering(action).await()
|
|
}
|