76 lines
2.6 KiB
Kotlin
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)
|
|
}
|
|
}
|