touch事件中重点关注下面3个方法:
dispatchTouchEvent 分发
OnInterceptTouchEvent 拦截
OnTouchEvent 执行
如果一个View实现了View.OnTouchListener ,那么OnTouchListener的OnTouch方法会先于OnTouchEvent做出响应,
OnTouch方法如果已经执行并返回true,那么OnTouchEvent就不会继续执行
事件的传递,传递的其实是MotionEvent,那么关于MotionEvent具体内容
MotionEvent是对触摸事件的信息封装,从MotionEvent的源码中可以看到很多方法的值都是来至于native层的
大体信息包括:触摸位置,触摸类型,触摸的数量(触摸点的数量),触摸的压力值等
事件类型:
ACTION_DOWN 、ACTION_UP 、 ACTION_MOVE 、ACTION_CANCLE 、ACTION_OUTSIDE
ACTION_POINTER_DOWN 、 ACTION_POINTER_UP
1) 触摸事件从ACTION_DOWN开始 -> ACTION_UP 或者 ACTION_CANCLE结束,中途可能会经过很多个ACTION_MOVE
ACTION_POINTER_DOWN 、 ACTION_POINTER_UP是针对于多点触控的,就是说触摸屏幕的点不止一个
2) 假设当前有两根手指触摸屏幕,那么事件的顺序大致是
第一个先触摸的触发ACTION_DOWN,后续第二根触发ACTION_POINTER_DOWN, 中途可能会有多个ACTION_MOVE事件
当有一根手指离开屏幕是触发ACTION_POINTER_UP , 当手指都离开了触发ACTION_UP
3) ACTION_CANCLE 常规来说是因为父控件拦截了事件,那么子控件接收不到后续的事件时, 子控件就会触发ACTION_CANCLE事件
4) ACTION_OUTSIDE 一般是 触摸的位置已经超出了控件的位置
事件位置:
getX() | getY() | getX(index) | getY(index) | getRawX() | getRawY() | getRawX(index) | getRawY(index)
1) getX/getY 获取的是相对位置,即该控制相对于父控件的位置
getRawX/getRawY 获取的是触控位置相对于屏幕的位置
2) getX / getX(index)
这两者的却别是 针对于多点触控 , 当只有一个触摸点时getX就是当前触摸点的位置;当有多个触摸点时,
参数index就是触控点的索引标识
3) getAction getActionMasked getActionIndex
getActionIndex 是索引 getActionMasked 是具体的事件类型
多点触控中 getAction的值 高2个字节是index ,低2个字节是事件类型