android touch事件分发机制

转载请注明出处:http://blog.csdn.net/ZhouLi_CSDN/article/details/45878337

看了网上那么多的博客 ,对于android系统的事件处理仍然不是明白的特别透彻,或者一些博客讲解的总是有些歧义或者讲诉的不正确或者不全面。所以自己总结了一下事件的传递机制希望可以帮助到广大的朋友。

  • 假设事件传送路径为A-B-C-D-E;
  • 一个手势是由事件action_down开始和action_move等其它事件以及事件action_up结束的集合;
  • 一个action_down意味着一个新的手势的开始,aciton_up意味着一个手势的结束;
  • 事件由activity的dispatchevent开始,通过调用子view(包括viewgroup)的dispatchevent向下传递,直到为一个view为止;
  • 之后事件会由最下层的view向上传递,由onTouchEvent进行处理,一直传递到activity的onTouchEvent;
    • 首先框架层最先处理的是action_down事件,如果此事件在传递过程中没有被oninterceptEvent掉(返回true为阻止),那么此事件将一直传递到最下层;
    • 此时事件将开始由下开始往上传递,并且如果在途中某一层(假设为D)消费掉(即onTouchEvent返回true),那么此事件将终止向上传递,并且以后事件也会通过D的dispatchEvent方法直接调用onTouchEvent方法进行处理(事件传递顺序A-B-C-D);
    • 如果传递过程中没有任何onTouchEvent进行消费,那么以后此事件将直接由activity的onTouchEvent进行处理。这意味着如果你想在某一层处理手势,你务必要在该层消费action_down以确保以后可以接收到事件。
  • action_down事件处理结束后将开始其它事件的处理(以下事件都是除了action_down的事件);
  • 你可以在某一层的onInterceptEvent中随时决定是否终止向下传递事件,这取决于你的手势处理逻辑;onInterceptEvent之后你将永远不能在向下传递事件了。
  • requestDisallowInterceptTouchEvent将阻止viewgroup对事件进行中断;
  • 如果在某一层onTouchEvent处理某一事件,并进行消费掉,那么该事件将不会在向上传递;否则将继续向上传递。

其它知识介绍:

ViewConfiguration类保存了一些常量,是由框架层为我们生成的。

1.其中getScaledTouchSlop 确定是否在滑动

2.fling,是否快速滑动

3.其它自己研究去吧。

目前先介绍到这里,后续在更新!

时间: 2024-10-10 10:00:05

android touch事件分发机制的相关文章

Android Touch事件分发机制学习

Android  事件分发机制 ViewGroup dispatchTouchEvent 返回true dispatchTouchEvent: Activity ACTION_DOWN MyrelativeLayout dispatchTouchEvent: ACTION_DOWN dispatchTouchEvent: Activity ACTION_UP MyrelativeLayout dispatchTouchEvent: ACTION_UP ViewGroup自己在dispatchTo

Android touch 事件传递机制

前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事件进行拦截.这个时候我们就需要明白android touch 事件传递机制, (2)以前很多时候比较模糊,也许是网上看到也有很多事件传递的相关文章,但我看着头晕,解释不彻底,有的说得一半,总算不满足不满意,于是据我自己的理解来彻底的来整理下具体的是怎么个传递方式,分享给大家,希望大家看到有什么不对的

Android View 事件分发机制 源码解析 (上)

一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志~ MyButton [java] view plain copy package com.example.zhy_event03; import android.content.Context; import andr

Android Touch事件传递机制详解 上

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/37961997 最近总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,以前也花时间学习过Android Touch事件的传递机制,可以每次用起来的时候总是忘记了,索性自己总结一下写篇文章避免以后忘记了,其实网上关于Touch事件的传递的文章真的很多,但是很少有系统性的,都是写了一个简单的demo运行了一下,对于我们了解Android Touch事件基本上没有任何帮助. 今

Android触摸事件分发机制

Android中的事件分为按键事件和触摸事件,这里对触摸事件进行阐述.Touch事件是由一个ACTION_DOWN,n个ACTION_MOVE,一个ACTION_UP组成onClick,onLongClick,onScroll等事件.Android中的控件都是继承View这个基类的,而控件分为两种:一种是继承View不能包含其他控件的控件:一种是继承ViewGroup可以包含其他控件的控件,暂且称为容器控件,比如ListView,GridView,LinearLayout等. 这里先对几个函数讲

Android View 事件分发机制源码详解(View篇)

前言 在Android View 事件分发机制源码详解(ViewGroup篇)一文中,主要对ViewGroup#dispatchTouchEvent的源码做了相应的解析,其中说到在ViewGroup把事件传递给子View的时候,会调用子View的dispatchTouchEvent,这时分两种情况,如果子View也是一个ViewGroup那么再执行同样的流程继续把事件分发下去,即调用ViewGroup#dispatchTouchEvent:如果子View只是单纯的一个View,那么调用的是Vie

Android Touch事件传递机制 二:单纯的(伪生命周期)

转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在我想使用一个demo以及一个实例来学习一下Andorid中的Touch事件处理过程. 在Android系统中,和Touch事件分发和处理紧密相关的三个函数如下:(1) public boolean dispatchTouchEvent(MotionEvent ev)(2) public boolea

Android Touch事件传递机制详解 下

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yuanzeyao2008/7660997 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在我想使用一个demo以及一个实例来学习一下Andorid中的Touch事件处理过程. 在Android系统中,和Touch事件分发和处理紧密相关的三个函数如下:(1) public

Android Touch事件分发详解

Android Touch事件分发详解 先说一些基本的知识,方便后面分析源码时能更好理解. - 所有Touch事件都被封装成MotionEvent对象,包括Touch的位置.历史记录.第几个手指等. 事件类型分为ACTION_DOWN,ACTION_UP,ACTION_MOVE,ACTION_POINTER_DOWN,ACTION_POINTER_UP,ACTION_CANCEL, 每个 一个完整的事件以ACTION_DOWN开始ACTION_UP结束,并且ACTION_CANCEL只能由代码引