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事件传递与处理过程。

更多相关文章

  1. Android音量相关知识总结(三)调节音量流程梳理
  2. mac 系统中Android(安卓)studio的一些快捷键
  3. Android的Touch系统简介(一)
  4. android实现动画效果的方法onDrawFrame
  5. Android(安卓)HandlerThread全面解析
  6. AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结
  7. Android线性布局重要属性
  8. android 文字尺寸(宽高)的测量
  9. 64位win7下Android(安卓)SDK Manager闪退的解决方法

随机推荐

  1. android的activitygroup使用
  2. 【Android平台】 Alljoyn学习笔记四 Andr
  3. Android 流媒体
  4. Android 子线程 更新 UI 界面 总结
  5. Android 代码片段---获取手机通讯录列表
  6. Android Tips Round-Up, Part 5
  7. Android Service一前台服务(四)
  8. android Camera 旋转 90 °问题
  9. 不让屏幕翻转扰乱你的进度对话框
  10. Android 采用MD5注册登录,加密解密