View的多点触摸
多点触摸就一个事
一个事件有 index和id,我们可以通过这两个去实现自己的逻辑,其中index与手指抬起间是会变得
而id永远不变
现在我们实现一个接力性的多点触摸玩玩
package com.example.rx_demo
<p>import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View</p>
<p>class MyTouchView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
val paint = Paint().apply {
color = Color.YELLOW
}
val rect = Rect(0, 0, 100f.dp.toInt(), 100f.dp.toInt())
var offsetX = 0f
var offsetY = 0f
var orginex = 0f
var orginey = 0f
var downx = 0f
var downy = 0f
var currid = 0</p>
<pre><code>override fun onDraw(canvas: Canvas) {
rect.set(
offsetX.toInt(),
offsetY.toInt(),
offsetX.toInt() + 100f.dp.toInt(),
offsetY.toInt() + 100f.dp.toInt()
)
canvas.drawRect(rect, paint)
}
override fun onTouchEvent(event: MotionEvent): Boolean {
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
downx = event.x
downy = event.y
orginex = offsetX
orginey = offsetY
currid = event.getPointerId(0)
}
MotionEvent.ACTION_POINTER_DOWN -> {
currid = event.getPointerId(event.actionIndex)
downx = event.getX(event.findPointerIndex(currid))
downy = event.getY(event.findPointerIndex(currid))
orginex = offsetX
orginey = offsetY
}
MotionEvent.ACTION_MOVE -> {
offsetX = event.getX(event.findPointerIndex(currid)) - downx + orginex
offsetY = event.getY(event.findPointerIndex(currid)) - downy + orginey
}
MotionEvent.ACTION_POINTER_UP -> {
var indexId = event.findPointerIndex(event.actionIndex)
if (indexId == currid) {
currid = if (event.actionIndex == event.pointerCount - 1) {
event.getPointerId(event.pointerCount - 2)
} else {
event.getPointerId(event.pointerCount - 1)
}
}
**//制定规则,如果是最后一个手指抬起了,则跟踪倒数第二根按下的手指,否则监听最后一根手指**
downx = event.getX(event.findPointerIndex(currid))
downy = event.getY(event.findPointerIndex(currid))
orginex = offsetX
orginey = offsetY
}
}
invalidate()
return true
}
}
评论区