有段时间没有写博客了,以前总是感觉对Android中的事件传递机制有着相对模糊的理解,今天抽空静心详细看了看。:

  • 前言
  • 主要方法
  • 流程详解
  • 前文

    总觉得知识必要要总结,不然就算再熟悉的东西,一段时间不接触就容易遗忘。
    Android中的触摸事件传递机制最重要的是是dispatchTouchEvent(),onInterceptTouchEvent()以及onTouchEvent()方法。
    touch事件首先会传递到Activity,然后传递到ViewGroup,再到具体的View.

  • 主要方法

dispatchTouchEvent():处理事件的分发,事件多数情况下是由Activity的dispatchTouchEvent开始。

onInterceptTouchEvent():处理事件的拦截,由ViewGroup()提供,意味着在activity中你不能够重写此方法。

onTouchEvent():触摸事件的处理。

  • 流程详解

    1,Touch事件的传入
    开始会由Activity接收事件,接下来事件会传递至Activity的dispatchTouchEvent(),这里默认情况下会是调用

    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        return super.dispatchTouchEvent(ev);    }

查看父类的super.dispatchTouchEvent:

    /** * Called to process a key shortcut event. * You can override this to intercept all key shortcut events before they are * dispatched to the window. Be sure to call this implementation for key shortcut * events that should be handled normally. * @return True if this event was consumed. */public boolean dispatchTouchEvent(MotionEvent ev) {    if (ev.getAction() == MotionEvent.ACTION_DOWN) {        onUserInteraction();    }    if (getWindow().superDispatchTouchEvent(ev)) {        return true;    }    return onTouchEvent(ev);}

这里判断条件第一个方法是个空方法,第二个判断条件是系统默认的事件分发机制。所以在activity中,如果手动修改dispatchTouchEvent的返回值,那么事件就会被消费,不在往里传递。

2,从Activity传入外层的ViewGroup

经历了Activity传入事件,第一个走的还是dispatchTouchEvent(),如果手动修改了返回值,事件到此终止,如果使用父类的super.dispatchTouchEvent,那么事件就会传递至onInterceptTouchEvent(),
- 在onInterceptTouchEvent中,:是否拦截本次事件传递

1, return true :那么事件会传递至viewGroup的onTouchEvent中。在   onTouchEvent中,:return true   事件被消费:return false  表示viewGroup当中的子控件都不想消费,那么它会直接把本次事件往回传,传至activity中去处理。2return false: 表示ViewGroup不想拦截,那么事件会继续下发至View

3,事件传递至ViewChild中

dipatchTouchEvent:还是和上面的一样,还是决定是否分发事件,系统的逻辑会自动运行到自己onTouchEvent方法中,如果你主动干预,决定是否分发(手动更改返回值),事件到这里就会终结.

onTouchevent:逻辑和之前的一样,问你是否消费本次事件,

return true :表示消费本次事件,事件结束return false:表示不消费本次事件,事件会回传给外一层控件,return super.onTouchEvent(event):是否消费本次事件就要看自己控件类型了(Text,Buttond等,是否消费跟类型有关)

更多相关文章

  1. Android实现在一个activity中添加多个listview的方法
  2. [置顶] Android 65K问题之Multidex原理分析及NoClassDefFoundErr
  3. EditText控件设置只读
  4. Android上鲜为人知的UI控件介绍和使用
  5. 用shape美化控件
  6. Android 通用获取Ip的方法(判断手机是否联网的方法)!!!
  7. Android获取音视频原始流数据方法详解

随机推荐

  1. MIT 科技评论采访 Martias Duarte: 游戏
  2. Android(安卓)10.0 PackageManagerServic
  3. 如何在Android中用好多线程
  4. 想抢先体验Android操作系统的魅力吗?那就
  5. Android开发指南-框架主题-内容提供器
  6. android系统架构图
  7. android binder机制中的BN跟BP
  8. Android本地应用程序应用方式介绍
  9. android sqlLite 及Adapter 自定义和Adap
  10. android 用 XML 自定义边框(只上下边框有