Touch事件分析(二)

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个字节是事件类型

results for ""

    No results matching ""