在Android中,事件主要包括点按、长按、拖拽、滑动等,点按又包括单击和双击,另外还包括单指操做和多指操做。全部这些都构成了Android中的事件响应。总的来讲,全部的事件都由以下三个部分做为基础:java
按下(ACTION_DOWN)布局
移动(ACTION_MOVE)spa
抬起(ACTION_UP)code
全部的操做事件首先必须执行的是按下操做(ACTIONDOWN),以后全部的操做都是以按下操做做为前提,当按下操做完成后,接下来多是一段移动(ACTIONMOVE)而后抬起(ACTION_UP),或者是按下操做执行完成后没有移动就直接抬起。这一系列的动做在Android中均可以进行控制。orm
咱们知道,全部的事件操做都发生在触摸屏上,而在屏幕上与咱们交互的就是各类各样的视图组件(View),在Android中,全部的视图都继承于View,另外经过各类布局组件(ViewGroup)来对View进行布局,ViewGroup也继承于View。全部的UI控件例如Button、TextView都是继承于View,而全部的布局控件例如RelativeLayout、容器控件例如ListView都是继承于ViewGroup。因此,咱们的事件操做主要就是发生在View和ViewGroup之间,那么View和ViewGroup中主要有哪些方法来对这些事件进行响应呢?记住以下3个方法,咱们经过查看View和ViewGroup的源码能够看到:继承
View.java事件
public boolean dispatchTouchEvent(MotionEvent event) public boolean onTouchEvent(MotionEvent event)
ViewGroup.java源码
public boolean dispatchTouchEvent(MotionEvent event) public boolean onTouchEvent(MotionEvent event) public boolean onInterceptTouchEvent(MotionEvent event)
在View和ViewGroup中都存在dispatchTouchEvent和onTouchEvent方法,可是在ViewGroup中还有一个onInterceptTouchEvent方法,那这些方法都是干吗的呢?别急,咱们先看看他们的返回值。这些方法的返回值所有都是boolean
型,为何是boolean型呢,看看本文的标题,“事件传递”,传递的过程就是一个接一个,那到了某一个点后是否要继续往下传递呢?你发现了吗,“是否”二字就决定了这些方法应该用boolean来做为返回值。没错,这些方法都返回true或者是false。在Android中,全部的事件都是从开始通过传递到完成事件的消费,这些方法的返回值就决定了某一事件是不是继续往下传,仍是被拦截了,或是被消费了。it
接下来就是这些方法的参数,都接受了一个MotionEvent
类型的参数,MotionEvent继承于InputEvent,用于标记各类动做事件。以前提到的ACTIONDOWN、ACTIONMOVE、ACTION_UP都是MotinEvent中定义的常量。咱们经过MotionEvent传进来的事件类型来判断接收的是哪种类型的事件。到如今,这三个方法的返回值和参数你应该都明白了,接下来就解释一下这三个方法分别在何时处理事件。io
dispatchTouchEvent
方法用于事件的分发,Android中全部的事件都必须通过这个方法的分发,而后决定是自身消费当前事件仍是继续往下分发给子控件处理。返回true表示不继续分发,事件没有被消费。返回false则继续往下分发,若是是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。
onTouchEvent
方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。
onInterceptTouchEvent
是ViewGroup中才有的方法,View中没有,它的做用是负责事件的拦截,返回true的时候表示拦截当前事件,不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。这是ViewGroup特有的方法,由于ViewGroup中可能还有子View,而在Android中View中是不能再包含子View的(iOS能够)。