Android Touch传递的一些简单规则
关于安卓中View之间的触摸事件传递的文章我已经搜集了很多篇了,在这个网站的搜索中你应该可以找到,下面的总结也许对加深理解仍然有用:
1. Touch事件是UI树形机构,由上向下传递。如果点击手机界面中的一个Button,其先传递给最外层的视图,经过层层向下传递给Button的父视图,其父视图再传递给Button处理。
2. 具体处理方法是View.onTouchEvent(MotionEvent event)
3. MotionEvent 中包含多种触屏操作,每种操作都用一个唯一的ID来标识,并且这些ID声明成为常量,最常见的就是ACTION_DOWN, ACTION_MOVE, ACTION_UP, ACTION_CANCEL四种动作。如果点击屏幕后慢慢移动,会执行的操作是,仅执行一次ACTION_DOWN, 移动过程中执行多次ACTION_MOVE, 抬起手指执行ACTION_UP。
4. 在1中提到Touch事件是从上向下传递的,在3中又提到触屏又有多种操作,这些操作是如何传递给需要具体操作的View的? 答案是每次操作都是从UI树形结构的上向下传递,例如ACTION_DOWN, ACTION_MOVE, ACTION_MOVE, ACTION_MOVE, ACTION_UP,一次触屏动作包含5个具体的操作,相当于UI树由上向下传递5次,第一个操作ACTION_DOWN操作并处理完成之后,再传递第二个操作ACTION_MOVE依此类推,直到执行完5此传递为止。
5. 具体是如何传递的? 涉及两方面,其一是UI树形结构决定了Touch传递的上下结构,其二是三个方法,包括负责分发Touch事件的View.dispatchTouchEvent, 处理拦截Touch事件ViewGroup.onInterceptTouchEvent, 视图针对触屏事件具体处理View.onTouchEvent,这三个方法决定了传递的具体流程。
6. 事件消耗,事件处理 - 指ACTION_DOWN, ACTION_MOVE, ACTION_UP, ACTION_CANCEL任一操作,只可能有两种情况。一 某一视图处理,可以叫做这个视图消耗了此次事件或者这个事件由此视图处理了,其他视图不再处理。 二 没有任何视图处理此事件。
7. Event.getX() 与 Event.getY() 向上移动,向下移动偏移值,正或负