AssimilateTranslate/app/src/main/java/com/assimilate/alltrans/curview/DrawChooseView.kt
2024-08-02 18:46:46 +08:00

76 lines
2.6 KiB
Kotlin

package com.assimilate.alltrans.curview
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.view.MotionEvent
import android.view.View
import com.assimilate.alltrans.listeners.OnRegionSelectedListener
class DrawChooseView(context: Context) : View(context) {
private var paintTransparent: Paint = Paint()
private var paintSemiTransparent: Paint = Paint()
private var rect: Rect? = null
private var startX: Float = 0f
private var startY: Float = 0f
init {
paintTransparent.color = Color.TRANSPARENT
paintTransparent.style = Paint.Style.FILL
paintSemiTransparent.color = Color.parseColor("#88000000") // 半透明黑色
paintSemiTransparent.style = Paint.Style.FILL
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
rect?.let {
val left = Math.min(it.left, it.right)
val right = Math.max(it.left, it.right)
val top = Math.min(it.top, it.bottom)
val bottom = Math.max(it.top, it.bottom)
// 绘制框选外的半透明区域
canvas.drawRect(0f, 0f, width.toFloat(), top.toFloat(), paintSemiTransparent)
canvas.drawRect(0f, top.toFloat(), left.toFloat(), bottom.toFloat(), paintSemiTransparent)
canvas.drawRect(right.toFloat(), top.toFloat(), width.toFloat(), bottom.toFloat(), paintSemiTransparent)
canvas.drawRect(0f, bottom.toFloat(), width.toFloat(), height.toFloat(), paintSemiTransparent)
// 绘制框选内的透明区域
canvas.drawRect(left.toFloat(), top.toFloat(), right.toFloat(), bottom.toFloat(), paintTransparent)
}
}
override fun onTouchEvent(event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
startX = event.x
startY = event.y
rect = Rect(startX.toInt(), startY.toInt(), startX.toInt(), startY.toInt())
invalidate()
return true
}
MotionEvent.ACTION_MOVE -> {
rect?.apply {
right = event.x.toInt()
bottom = event.y.toInt()
}
invalidate()
return true
}
MotionEvent.ACTION_UP -> {
rect?.let {
(context as? OnRegionSelectedListener)?.onRegionSelected(it)
}
return true
}
}
return super.onTouchEvent(event)
}
}