@@ -23,42 +23,43 @@ import java.io.IOException
2323import java.util.*
2424
2525class Preview : ViewGroup , SurfaceHolder .Callback , MediaScannerConnection .OnScanCompletedListener {
26- companion object {
27- var mCamera: Camera ? = null
28- private val TAG = Preview ::class .java.simpleName
29- private val FOCUS_AREA_SIZE = 100
30- private val PHOTO_PREVIEW_LENGTH = 500L
31-
32- lateinit var mSurfaceHolder: SurfaceHolder
33- lateinit var mSurfaceView: SurfaceView
34- lateinit var mActivity: MainActivity
35- lateinit var mCallback: PreviewListener
36- lateinit var mScreenSize: Point
37- lateinit var config: Config
38- private var mSupportedPreviewSizes: List <Camera .Size >? = null
39- private var mPreviewSize: Camera .Size ? = null
40- private var mParameters: Camera .Parameters ? = null
41- private var mRecorder: MediaRecorder ? = null
42- private var mTargetUri: Uri ? = null
43- private var mScaleGestureDetector: ScaleGestureDetector ? = null
44- private var mZoomRatios: List <Int >? = null
45-
46- private var mCurrVideoPath = " "
47- private var mCanTakePicture = false
48- private var mIsRecording = false
49- private var mIsVideoMode = false
50- private var mIsSurfaceCreated = false
51- private var mSwitchToVideoAsap = false
52- private var mSetupPreviewAfterMeasure = false
53- private var mIsSixteenToNine = false
54- private var mWasZooming = false
55- private var mIsPreviewShown = false
56- private var mLastClickX = 0
57- private var mLastClickY = 0
58- private var mCurrCameraId = 0
59- private var mMaxZoom = 0
60- private var mRotationAtCapture = 0
61- }
26+ var mCamera: Camera ? = null
27+ private val TAG = Preview ::class .java.simpleName
28+ private val FOCUS_AREA_SIZE = 100
29+ private val PHOTO_PREVIEW_LENGTH = 500L
30+ private val REFOCUS_PERIOD = 3000L
31+
32+ lateinit var mSurfaceHolder: SurfaceHolder
33+ lateinit var mSurfaceView: SurfaceView
34+ lateinit var mActivity: MainActivity
35+ lateinit var mCallback: PreviewListener
36+ lateinit var mScreenSize: Point
37+ lateinit var config: Config
38+ private var mSupportedPreviewSizes: List <Camera .Size >? = null
39+ private var mPreviewSize: Camera .Size ? = null
40+ private var mParameters: Camera .Parameters ? = null
41+ private var mRecorder: MediaRecorder ? = null
42+ private var mTargetUri: Uri ? = null
43+ private var mScaleGestureDetector: ScaleGestureDetector ? = null
44+ private var mZoomRatios: List <Int >? = null
45+
46+ private var mCurrVideoPath = " "
47+ private var mCanTakePicture = false
48+ private var mIsRecording = false
49+ private var mIsVideoMode = false
50+ private var mIsSurfaceCreated = false
51+ private var mSwitchToVideoAsap = false
52+ private var mSetupPreviewAfterMeasure = false
53+ private var mIsSixteenToNine = false
54+ private var mWasZooming = false
55+ private var mIsPreviewShown = false
56+ private var mLastClickX = 0
57+ private var mLastClickY = 0
58+ private var mCurrCameraId = 0
59+ private var mMaxZoom = 0
60+ private var mRotationAtCapture = 0
61+ private var mIsFocusing = false
62+ private var autoFocusHandler = Handler ()
6263
6364 constructor (context: Context ) : super (context)
6465
@@ -292,6 +293,7 @@ class Preview : ViewGroup, SurfaceHolder.Callback, MediaScannerConnection.OnScan
292293 mCamera!! .takePicture(null , null , takePictureCallback)
293294 }
294295 mCanTakePicture = false
296+ mIsFocusing = false
295297 }
296298
297299 private val takePictureCallback = Camera .PictureCallback { data, cam ->
@@ -315,12 +317,16 @@ class Preview : ViewGroup, SurfaceHolder.Callback, MediaScannerConnection.OnScan
315317 mActivity.toggleBottomButtons(false )
316318 mCamera?.startPreview()
317319 mCanTakePicture = true
320+ focusArea(false , false )
318321 }
319322
320323 private fun focusArea (takePictureAfter : Boolean , showFocusRect : Boolean = true) {
321- if (mCamera == null )
324+ if (mCamera == null || (mIsFocusing && ! takePictureAfter) )
322325 return
323326
327+ if (takePictureAfter)
328+ mIsFocusing = true
329+
324330 mCamera!! .cancelAutoFocus()
325331 if (mParameters!! .maxNumFocusAreas > 0 ) {
326332 if (mLastClickX == 0 && mLastClickY == 0 ) {
@@ -344,12 +350,14 @@ class Preview : ViewGroup, SurfaceHolder.Callback, MediaScannerConnection.OnScan
344350 mParameters!! .focusMode = Camera .Parameters .FOCUS_MODE_CONTINUOUS_PICTURE
345351
346352 camera.parameters = mParameters
353+
347354 if (takePictureAfter) {
348355 takePicture()
349356 } else if (! mIsVideoMode || ! mIsRecording) {
350- Handler ().postDelayed({
357+ autoFocusHandler.removeCallbacksAndMessages(null )
358+ autoFocusHandler.postDelayed({
351359 focusArea(false , false )
352- }, 3000 )
360+ }, REFOCUS_PERIOD )
353361 }
354362 }
355363 }
0 commit comments