CameraFocusView.kt 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package com.ethan.psbc.ui.widget
  2. import android.content.Context
  3. import android.graphics.Canvas
  4. import android.graphics.Color
  5. import android.graphics.Paint
  6. import android.graphics.RectF
  7. import android.os.Handler
  8. import android.util.AttributeSet
  9. import android.util.TypedValue
  10. import android.view.View
  11. import androidx.constraintlayout.widget.ConstraintLayout
  12. import com.qmuiteam.qmui.util.QMUIDisplayHelper.getDisplayMetrics
  13. class CameraFocusView(context: Context?,attrs: AttributeSet?) : View(context,attrs) {
  14. private var focusSize = 0 //焦点框的大小
  15. private var focusColor = 0 //焦点框的颜色
  16. private var focusTime = 0 //焦点框显示的时长
  17. private var focusStrokeSize = 0 //焦点框线条的尺寸
  18. private var cornerSize = 0 //焦点框圆角尺寸
  19. private var handler: Handler? = null
  20. private var runnable: Runnable? = null
  21. private var mPaint: Paint? = null
  22. private var rect: RectF? = null
  23. init {
  24. if (context != null) {
  25. init(context)
  26. }
  27. }
  28. private fun init(context: Context) {
  29. handler = Handler()
  30. mPaint = Paint(Paint.ANTI_ALIAS_FLAG)
  31. rect = RectF()
  32. runnable = Runnable {
  33. hideFocusView()
  34. }
  35. }
  36. fun setParam(
  37. focusViewSize: Int, focusViewColor: Int, focusViewTime: Int,
  38. focusViewStrokeSize: Int, cornerViewSize: Int
  39. ) {
  40. if (focusViewSize == -1) {
  41. this.focusSize = dp2px(context, 60F)
  42. } else {
  43. this.focusSize = focusViewSize
  44. }
  45. if (focusViewColor == -1) {
  46. this.focusColor = Color.GREEN
  47. } else {
  48. this.focusColor = focusViewColor
  49. }
  50. this.focusTime = focusViewTime
  51. if (focusViewStrokeSize == -1) {
  52. this.focusStrokeSize = dp2px(context, 2F)
  53. } else {
  54. this.focusStrokeSize = focusViewStrokeSize
  55. }
  56. if (cornerViewSize == -1) {
  57. this.cornerSize = focusSize / 5
  58. } else {
  59. this.cornerSize = cornerViewSize
  60. }
  61. mPaint!!.style = Paint.Style.STROKE
  62. mPaint!!.strokeWidth = focusStrokeSize.toFloat()
  63. mPaint!!.color = focusColor
  64. rect!!.top = 0f
  65. rect!!.left = rect!!.top
  66. rect!!.bottom = focusSize.toFloat()
  67. rect!!.right = rect!!.bottom
  68. }
  69. fun showFocusView(x: Int, y: Int) {
  70. visibility = VISIBLE
  71. val layoutParams = layoutParams as ConstraintLayout.LayoutParams
  72. layoutParams.leftMargin = x - focusSize / 2
  73. layoutParams.topMargin = y - focusSize / 2
  74. setLayoutParams(layoutParams)
  75. invalidate()
  76. runnable?.let { handler?.postDelayed(it, (focusTime * 1000).toLong()) }
  77. }
  78. fun hideFocusView() {
  79. visibility = GONE
  80. runnable?.let { handler?.removeCallbacks(it) }
  81. }
  82. override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
  83. setMeasuredDimension(focusSize, focusSize)
  84. }
  85. override fun onDraw(canvas: Canvas) {
  86. super.onDraw(canvas)
  87. canvas.drawRoundRect(rect!!, cornerSize.toFloat(), cornerSize.toFloat(), mPaint!!)
  88. }
  89. override fun onDetachedFromWindow() {
  90. runnable?.let { handler?.removeCallbacks(it) }
  91. super.onDetachedFromWindow()
  92. }
  93. fun dp2px(mContext:Context, dipValue:Float) : Int {
  94. return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, getDisplayMetrics(mContext)).toInt()
  95. }
  96. }