Android中事件处理机制---完

来源:互联网 发布:守望先锋数据面板 编辑:程序博客网 时间:2024/06/07 00:40

Android中事件处理机制

Android事件处理机制中包括事件的分发、事件的拦截和事件的处理。最后还有一个怎么使一个布局的父布局不去拦截事件,事件分发本身具有消费事件的能力
事件的消费指的是,这个事件被完结了,完全不存在了。

alt text

  • 事件的分发
    public boolean dispatchTouchEvent(MotionEvent event)
    • 属于View的方法,用来通知下面的视图,屏幕产生了触摸事件
    • 返回值:
      • true:表示事件分发到此结束,不再调用拦截和处理,事件被消费了(屏蔽掉了这次事件???)
      • false:事件分发结束,交由上一层的视图或者Activity的onTouchEvent来处理
        • 如果是Activity返回了false,事件交由系统来处理或消费
        • 如果是普通视图,交由上一层的视图(处于第三层视图及以下或者Activity的onTouchEvent来处理(处于第二层视图),Activity属于第一层视图
      • super:交由本层onInterceptTouchEvent处理
        • 如果是Activity,交给下一层视图的事件分发如果是View,直接调用事件处理onTouchEvent()
  • 事件的拦截
    public boolean onInterceptTouchEvent(MotionEvent ev)
    • 属于ViewGroup的方法,用来拦截事件,不再对其下的子视图进行事件的分发(触摸屏幕事件到当前布局结束,布局中的所有子控件都无法接收到触屏事件)。
    • 返回值:
      • true:说明当前视图要拦截事件,不再对下面的视图进行分发,直接由当前视图的onTouchEvent事件来处理
      • false:交由下一个视图的dispathTouchEvent来处理,不再拦截
      • super:和false结果一样
  • 事件的处理
    public boolean onTouchEvent(MotionEvent event)

    • 处理屏幕单击事件,前提是能够接受到事件分发
    • 返回值:
      • true:响应了该事件,并且已消费。此事件终结,不再进行后续的冒泡
      • false:该层响应了这个事件,并没有消费,事件会继续向上层冒泡,且由上层的View的onTouchEvent()进行处理
      • super:和false效果一样
  • 如何让父布局不再拦截事件
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept)
    eg. parentView.requestDisallowInterceptTouchEvent(true)

一个事件从产生到消亡的整个过程

alt text

0 0