• Android事件分发传递


    一、与触摸事件有关的几个方法

    boolean dispatchTouchEvent(MotionEvent ev);
    接收到触摸事件时,是否分发事件到下面的View
    返回true:分发触摸事件
    返回false:不分发,下面的View就拿不到触摸事件
    boolean onInterceptTouchEvent(MotionEvent ev);
    接收到触摸事件时,是否拦截事件
    返回true:拦截,则调用onTouchEvent方法处理事件
    返回false:不拦截,事件继续往子View传
    boolean onTouchEvent(MotionEvent ev);
    是否响应事件
    返回true:响应
    返回false:不响应
    boolean onTouch(View v, MotionEvent event);
    是否响应事件,当View调用了setOnTouchListener方法设置了触摸监听器,则事件响应的时候先调用onTouch方法
    返回true:响应,则onTouchEvent方法不执行
    返回false:不响应,并调用onTouchEvent方法
    void requestDisallowInterceptTouchEvent(boolean disallowIntercept);
    请求父控件是否不拦截事件
    返回true:不允许父控件的onInterceptTouchEvent调用
    返回false:允许调用


    二、拥有这些方法的类

    父类 子类 拥有的方法
    Activity Activity dispatchTouchEvent、onTouchEvent

    ViewGroup
    RelativeLayout, LinearLayout... dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent、requestDisallowInterceptTouchEvent
    View Button、TextView... dispatchTouchEvent、onTouchEvent

    三、事件处理规则

    触摸事件是从Activity分发(只是分发,还没有处理)到父控件,父控件先判断是否拦截,如果不拦截事件,则继续分发到子控件,然后一直往下分发。但处理就刚好相反,由子控件先处理事件,如果子控件没有处理事件,则交给到父控件处理,一直往上处理,直到哪个控件处理了触摸事件,就事件处理就到此结束。

    1.当用户触摸屏幕的时候,从按下到移动,最后到抬起,会依次产生ACTION_DOWN、ACTION_MOVE、ACTION_UP三种触摸事件,事件先传到Activity,然后Activity调用分发事件方法dispatchTouchEvent,如果返回true,则事件就会传给Activity的第一个父控件。

    2.父控件拿到事件之后,也会调用分发事件方法dispatchTouchEvent,如果返回true,则继续调用拦截方法onInterceptTouchEvent,如果返回true,则父控件拦截了事件,并调用父控件的onTouchEvent方法,下面的子控件就不会再响应onTouchEvent,onTouch的方法。

    3.子控件拿到事件之后,先判断是否设置了OnTouchListener, 如果设置了,则调用OnTouchListener的onTouch方法,如果返回true,事件已经处理到此结束,则跳过onTouchEvent方法,否则调用onTouchEvent方法,当onTouchEvent方法返回true,则事件处理到此结束,上面的父控件就不会再调用onTouchEvent方法。

    4.如果某一个控件响应了ACTION_DOWN事件,则后续的ACTION_MOVE、ACTION_UP事件就会直接交给该控件处理,除非它的父控件拦截了后续的事件,但可以在处理ACTION_DOWN事件时,调用requestDisallowInterceptTouchEvent禁止父控件的拦截。如果控件没有处理ACTION_DOWN事件,则后续的事件就不会再传到该控件中,当下一次的ACTION_DOWN事件产生时,还是会传给该View的。

  • 相关阅读:
    部分网络加载预训练模型代码实现
    数据不平衡处理方法
    面试题目汇总
    多线程和多进程
    数据结构知识点总结
    GBDT和XGBoost的区别
    GBDT和随机森林的区别
    机器学习-特征处理
    一篇写得很好的关于lct的博客
    Count and Say 2014/10/23
  • 原文地址:https://www.cnblogs.com/yoyohong/p/6169012.html
Copyright © 2020-2023  润新知