android-事件体系

2018-08-20  本文已影响32人  三季人

View事件event

什么是事件,当用户触摸屏幕的时候,就会产生一个事件event

事件相关的细节(发生触摸的位置、时间、历史记录、手势动作等都封装在MotionEvent中)


touch事件有如下四种:

  1. MotionEvent.ACTION_DOWN:按下View(所有事件的开始)
  2. MotionEvent.ACTION_MOVE:滑动View
  3. MotionEvent.ACTION_CANCEL:非人为原因结束本次事件
  4. MotionEvent.ACTION_UP:抬起View(与DOWN对应)

事件列表
android 事件从产生到结束一共经过如下这几个过程

事件的分发机制

android 事件分发主要有三个方法控制:

1. onDispatchTouchEvent()   事件的分发
2. onInterceptTochEvent()    事件的拦截
3. onTouchEvent()       事件的消费
onDispatchTouchEvent() 事件的分发
属性 介绍
作用对象 Activity、ViewGroup、View
作用 分发点击事件
调用时刻 当点击事件能够传递给当前对象的时候,就会调用该方法
返回结果 是否消费当前事件:详细情况如下

返回super.dispatchTouchEvent(ev) 表示调用父类中的方法

  1. 返回true 表示
    • 消费这个事件
    • 事件不会向下传递
    • 后续的(move、up)会继续分发给该view
  2. 返回false 表示
    • 不消费这个事件
    • 事件也不会向下传递
    • 将事件回传给父类的onTouchEvent()
    • 后续的(move、up)会继续分发给该view

注意: 有一个特例: 在activity中,onDispatchTouchEvent()返回false的时候,表示消费事件

onTouchEvent()

onTouchEvetn与onDispatchTouchEvent()类似

属性 介绍
作用对象 Activity、ViewGroup、View
作用 处理点击事件
调用时刻 在onDispatchTouchEvent()内部调用
返回结果 是否消费处理当前事件:详细情况如下
  1. 返回true

    • 自己消费处理事件
    • 事件停止传递
    • 后续事件也由自己处理
  2. 返回false

    • 不处理消费事件
    • 事件向上传递给父类的onTouchEvent()处理
    • 当前view不再接受处理其他事件(move、up)
onDispatchTouchEvent()

onDispatchTouchEvent只有GroupView才有此方法

属性 介绍
作用对象 ViewGroup(注:Activity、View中都没有)
作用 处理拦截事件
调用时刻 ViewGroup中onDispatchTouchEvent()内部调用
返回结果 是否拦截当前事件:详细情况如下
  1. 返回true

    • 拦截事件
    • 事件不会向下传递
    • 自己处理事件,即调用自己的onTouchEvent()
    • 同一个事件列中的事件都由该事件处理
  2. 返回false

    • 不拦截事件
    • 事件会向下传递
    • 事件传递到子view,调用子view的onDispatchTouchEvent()处理
    • 当前view任然接受其他事件(和onTouchEvent()不同)

参考:

View的事件体系

Android事件分发机制详解:史上最全面、最易懂

上一篇下一篇

猜你喜欢

热点阅读