文章目录
前言
在之前的那篇博客中我们做了一个可以随手指移动的图片view,只能支持单指操控,如果我们多指触控就没事我们想要的效果
多点触控可以有下面这三种类型
①:接力棒型或抢占型
②:协作型
③:互不干扰型
一、接力棒型或抢占型
思路
①:确认一个触摸点作为控制图片的特殊触摸点
②:移动时就把拥有图片控制权的触点作为唯一触点
③:如果有第二根手指按下,那么控制权第由一根手指交接到第二根手指
④:如果有多个手指,这时其中一个抬起,那么如果抬起的这根手指时拥有对图片控制权的,那么交换控制权
code
一:ACTION_DOWN
时,只有一根手指按下,就把图片操控权赋给index为0的这根唯一手指
MotionEvent.ACTION_DOWN -> {
leadingPointerId = event.getPointerId(0)
downX = event.x
downY = event.y
originOffsetX = offsetX
originOffsetY = offsetY
}
二:ACTION_POINTER_DOWN
时,就把图片控制权交给新手指
//接力,把图片控制权交给刚点击的指头
MotionEvent.ACTION_POINTER_DOWN -> {
val actionIndex = event.actionIndex
leadingPointerId = event.getPointerId(actionIndex)
downX = event.getX(actionIndex)
downY = event.getY(actionIndex)
originOffsetX = offsetX
originOffsetY = offsetY
}
三:有手指抬起
//接力,如果移走的指头时拥有控制权的指头,把控制权交给其他指头
MotionEvent.ACTION_POINTER_UP -> {
val isLeadingPointer = event.findPointerIndex(leadingPointerId) == event.actionIndex
if (isLeadingPointer) {
val newIndex =
if (event.findPointerIndex(leadingPointerId) == event.pointerCount - 1) {
event.pointerCount - 2
} else {
event.pointerCount - 1
}
leadingPointerId = event.getPointerId(newIndex)
downX = event.getX(newIndex)
downY = event.getY(newIndex)
originOffsetX = offsetX
originOffsetY = offsetY
}
}
1:如果抬起的手指没有图片的控制权,则不做处理
2:如果抬起的手指有图片的控制权
①:如果抬起的这个手指是最后一根,那么就把控制权交给倒数第二根
②:否则交给倒数第一根
3:只有接力时,downX
,originOffsetY
这些值才更新
完整代码
package com.lbj23.customview.customview
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View