多点触控 Android 自定义控件

本文详细介绍了Android中实现多点触控的三种方式:接力棒型(抢占型)、协作型和各自为战型。接力棒型在手指抬起时会交换控制权;协作型则根据多根手指的几何中心来共同操控图片;各自为战型则是每个手指独立操作。文中给出了详细的思路、代码示例和效果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

在之前的那篇博客中我们做了一个可以随手指移动的图片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:只有接力时,downXoriginOffsetY这些值才更新

完整代码

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值