type
status
date
slug
summary
tags
category
password
icon

MotionEvent.getActionMasked()

常见值:
  • ACTION_DOWN
    • 第⼀个⼿指按下(之前没有任何⼿指触摸到 View)
  • ACTION_UP
    • 最后⼀个⼿指抬起(抬起之后没有任何⼿指触摸到 View,这个⼿指未必是 ACTION_DOWN 的那个⼿指)
      💡
      注意第一个按下的手指和最后一个抬起的手指不一定是同一个
  • ACTION_MOVE
    • 有⼿指发⽣移动
  • ACTION_POINTER_DOWN
    • 额外⼿指按下(按下之前已经有别的⼿指触摸到 View)
  • ACTION_POINTER_UP
    • 有⼿指抬起,但不是最后⼀个(抬起之后,仍然还有别的⼿指在触摸着 View)
       
💡
多点触控时,MotionEvent 中会记录一系列事件 p(x,y,index,id) 其中 x,y 表示坐标,index 表示是第几个手指,id 表示手指的身份。 当有两个手指同时移动时,同一时刻会有两个事件,例如 p(100,200,0,2123123) p(300,400,1,2134234) 通过 getX() 永远只能获取 index 为 0 的那个手指的事件,而 index 是会变化的,当前面的 index 松开了,后面的 index 会前移,但是 id 值是不会变的。所以可以通过 id 追踪手指,通过 index 做遍历

MotionEvent.getActionIndex(index)

获取「⾮第⼀根按下⼿指」或「⾮最后⼀根抬起⼿指」的 index
 

触摸事件的结构

  • 接⼒型
    • 同⼀时刻只有⼀个 pointer 起作⽤,即最新的 pointer。 典型:ListView、RecyclerView。 实现⽅式:在 ACTION_POINTER_DOWN 和 ACTION_POINTER_UP 时记录下最新的 pointer,在之后的 ACTION_MOVE 事件中使⽤这个 pointer 来判断位置。
  • 配合型 / 协作型
    • 所有触摸到 View 的 pointer 共同起作⽤。 典型:ScaleGestureDetector,以及 GestureDetector 的 onScroll() ⽅法判断。 实现⽅式:在每个 DOWN、POINTER_DOWN、POINTER_UP、UP 事件中使⽤所有 pointer 的坐标来共同更新焦点坐标,并在 MOVE 事件中使⽤所有 pointer 的坐标来判断位置。
  • 各⾃为战型
    • 各个 pointer 做不同的事,互不影响。 典型:⽀持多画笔的画板应⽤。 实现⽅式:在每个 DOWN、POINTER_DOWN 事件中记录下每个 pointer 的 id,在 MOVE 事件中使⽤ id 对它们进⾏跟踪。
 
 
ConstraintLayout 详解m3u8(带加密)文件转 mp4
Loading...
shuouyang
shuouyang
android开发 ReactNative开发 小程序开发
最新发布
AOSP 环境搭建
2025-3-29
View 绘制流程-源码解析
2025-3-12
HTTP
2025-3-4
JVM 虚拟机
2025-2-28
蓝牙-BLE-基础
2025-2-28
从 OkHttp 的原理来看 HTTP
2025-2-19
公告
🎉热点信息🎉
--- 1 ---
Jet Brains 推出新的跨平台支持 Kotlin MultiPlatform
--- 2 ---
新的小巧便捷的依赖注入框架 Koin
--- 3 ---
新一代 API 查询语言 GraphQL