replace textureView click listener with manual touch events checking

This commit is contained in:
tibbi 2018-06-01 20:06:21 +02:00
parent 1708bf562a
commit bbe2ba171d

View File

@ -30,6 +30,8 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
private val FOCUS_TAG = "focus_tag" private val FOCUS_TAG = "focus_tag"
private val MAX_PREVIEW_WIDTH = 1920 private val MAX_PREVIEW_WIDTH = 1920
private val MAX_PREVIEW_HEIGHT = 1080 private val MAX_PREVIEW_HEIGHT = 1080
private val CLICK_MS = 250
private val CLICK_DIST = 20
private lateinit var mActivity: MainActivity private lateinit var mActivity: MainActivity
private lateinit var mTextureView: AutoFitTextureView private lateinit var mTextureView: AutoFitTextureView
@ -38,8 +40,9 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
private var mRotationAtCapture = 0 private var mRotationAtCapture = 0
private var mZoomLevel = 1 private var mZoomLevel = 1
private var mZoomFingerSpacing = 0f private var mZoomFingerSpacing = 0f
private var mLastClickX = 0f private var mDownEventAtMS = 0L
private var mLastClickY = 0f private var mDownEventAtX = 0f
private var mDownEventAtY = 0f
private var mIsFlashSupported = true private var mIsFlashSupported = true
private var mIsZoomSupported = true private var mIsZoomSupported = true
private var mIsImageCaptureIntent = false private var mIsImageCaptureIntent = false
@ -72,18 +75,21 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
mTextureView.setOnTouchListener { view, event -> mTextureView.setOnTouchListener { view, event ->
if (event.action == MotionEvent.ACTION_DOWN) { if (event.action == MotionEvent.ACTION_DOWN) {
mLastClickX = event.x mDownEventAtMS = System.currentTimeMillis()
mLastClickY = event.y mDownEventAtX = event.x
mDownEventAtY = event.y
} else if (event.action == MotionEvent.ACTION_UP) {
if (System.currentTimeMillis() - mDownEventAtMS < CLICK_MS &&
Math.abs(event.x - mDownEventAtX) < CLICK_DIST &&
Math.abs(event.y - mDownEventAtY) < CLICK_DIST) {
focusArea(event.x, event.y)
}
} }
if (mIsZoomSupported && event.pointerCount > 1) { if (mIsZoomSupported && event.pointerCount > 1) {
handleZoom(event) handleZoom(event)
} }
false true
}
mTextureView.setOnClickListener {
focusArea()
} }
} }
@ -417,8 +423,8 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
} }
// inspired by https://gist.github.com/royshil/8c760c2485257c85a11cafd958548482 // inspired by https://gist.github.com/royshil/8c760c2485257c85a11cafd958548482
private fun focusArea() { private fun focusArea(x: Float, y: Float) {
mActivity.drawFocusCircle(mLastClickX, mLastClickY) mActivity.drawFocusCircle(x, y)
val captureCallbackHandler = object : CameraCaptureSession.CaptureCallback() { val captureCallbackHandler = object : CameraCaptureSession.CaptureCallback() {
override fun onCaptureCompleted(session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) { override fun onCaptureCompleted(session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) {
@ -441,7 +447,7 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
// touch-to-focus inspired by OpenCamera // touch-to-focus inspired by OpenCamera
if (characteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF) >= 1) { if (characteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF) >= 1) {
val focusArea = getFocusArea() val focusArea = getFocusArea(x, y)
val sensorRect = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE) val sensorRect = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)
val meteringRect = convertAreaToMeteringRectangle(sensorRect, focusArea) val meteringRect = convertAreaToMeteringRectangle(sensorRect, focusArea)
set(CaptureRequest.CONTROL_AF_REGIONS, arrayOf(meteringRect)) set(CaptureRequest.CONTROL_AF_REGIONS, arrayOf(meteringRect))
@ -481,8 +487,8 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
return Rect(left, top, right, bottom) return Rect(left, top, right, bottom)
} }
private fun getFocusArea(): FocusArea { private fun getFocusArea(x: Float, y: Float): FocusArea {
val coords = floatArrayOf(mLastClickX, mLastClickY) val coords = floatArrayOf(x, y)
calculateCameraToPreviewMatrix() calculateCameraToPreviewMatrix()
mPreviewToCameraMatrix.mapPoints(coords) mPreviewToCameraMatrix.mapPoints(coords)
val focusX = coords[0].toInt() val focusX = coords[0].toInt()