View事件传递分析

来源:互联网 发布:js二级联动省市代码 编辑:程序博客网 时间:2024/05/21 03:17

Android的事件都是由许多touch事件组成,touch的第一个状态肯定是ACTION_DOWN,表示按下了屏幕,之后的事件可以是:
ACTION_MOVE // 表示为移动手势
ACTION_UP // 表示为离开屏幕
ACTION_CANCEL // 表示为取消手势,不会由用户操作产生,由程序产生
一个ACTION_DOWN, n个ACTION_MOVE, 1个ACTION_UP,就构成了Android中众多的事件。

事件传递原则:
从底层View依次向上层View传递,过程就是一个接一个,某一个点后根据方法boolean的返回值判断是否要继续往下传递。在Android中,所有的事件都是从开始经过传递到完成事件的消费,这些方法的返回值就决定了某一事件是否是继续往下传,还是被拦截了,或是被消费了。

所有的操作事件首先必须执行的是按下操作(ACTIONDOWN),之后所有的操作都是以此作为前提,因为所有的事件操作都发生在触摸屏上,而在屏幕上与用户交互的就是各种各样的视图组件(View),在Android中,所有的视图都继承于View,另外通过各种布局组件(ViewGroup)来对View进行布局,ViewGroup也继承于View。所有的UI控件例如Button、TextView都是继承于View,而所有的布局控件如RelativeLayout、容器控件例如ListView都是继承于ViewGroup。所以,事件操作主要就是发生在View和ViewGroup之间,View和ViewGroup中主要有如下3个方法来对这些事件进行响应:

1public boolean dispatchTouchEvent(MotionEvent event)2、 public boolean onTouchEvent(MotionEvent event)3、 public boolean onInterceptTouchEvent(MotionEvent event)   (ViewGroup)

dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发,然后决定是自身消费当前事件还是继续往下分发给子控件处理。返回true表示不继续分发,事件没有被消费。返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。

onInterceptTouchEvent是ViewGroup中才有的方法,View中没有,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。这是ViewGroup特有的方法,因为ViewGroup中可能还有子View,而在Android中View中是不能再包含子View的。

onTouchEvent方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。

这里写图片描述

最上层View消耗ACTION_DOWN:

这里写图片描述

最上层View消耗ACTION_MOVE:

这里写图片描述

父View拦截MOVE:

这里写图片描述

父View拦截并消耗DOWN:

这里写图片描述

父View处理MOVE:

这里写图片描述

View的事件处理就分析到这,接下来会通过分析系统的Launcher源码来理解View事件传递与处理过程。

0 0
原创粉丝点击