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 -&gt; {
            downx = event.x
            downy = event.y
            orginex = offsetX
            orginey = offsetY
            currid = event.getPointerId(0)
        }

        MotionEvent.ACTION_POINTER_DOWN -&gt; {
            currid = event.getPointerId(event.actionIndex)
            downx = event.getX(event.findPointerIndex(currid))
            downy = event.getY(event.findPointerIndex(currid))
            orginex = offsetX
            orginey = offsetY
        }

        MotionEvent.ACTION_MOVE -&gt; {
            offsetX = event.getX(event.findPointerIndex(currid)) - downx + orginex
            offsetY = event.getY(event.findPointerIndex(currid)) - downy + orginey
        }

        MotionEvent.ACTION_POINTER_UP -&gt; {
            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
}

}