android ontouch事件分发机制

android中onclick,onlongclick,onfling,onscroll等事件都是由多个ontouch事件构成,一个完整的触屏事件必须包含1个ACTION_DOWN(按下),多个ACTION_MOVE(移动),1个ACTION_UP(放开)构成,touch事件分发就是这些事件在viewgroup和view之间轮转的过程。

1、viewgroup继承view,view中包含dispatchTouchEvent和onTouchEvent两个和事件分发直接相关两个方法,viewgroup除了重写了view的dispatchTouchEvent方法外还定义了一个onInterceptTouchEvent方法;

  dispatchTouchEvent:touch事件分发的发起者,每个touch事件必须先调用该方法

  onInterceptTouchEvent:只存在于viewgroup容器中,它决定当前事件是否可以向groupview的子控件view传递

  onTouchEvent:接收并处理事件,返回值true表示消费了当前事件

2、对于一个viewgroup的touch事件,首先触发的是dispatchTouchEvent,在dispatchTouchEvent方法体会调用onInterceptTouchEvent方法来判断事件是传递给viewgroup的onTouchEvent还是子view的onTouchEvent事件

  看看如下onInterceptTouchEvent调用代码

final boolean intercepted;
            if (actionMasked == MotionEvent.ACTION_DOWN
                    || mFirstTouchTarget != null) {
                final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
                if (!disallowIntercept) {
                    intercepted = onInterceptTouchEvent(ev);
                    ev.setAction(action); // restore action in case it was changed
                } else {
                    intercepted = false;
                }
            } else {
                // There are no touch targets and this action is not an initial down
                // so this view group continues to intercept touches.
                intercepted = true;
            }
intercepted ==true是表示父容器会拦截该触屏事件,后续事件不会传给子view;mFirstTouchTarget表示消费了touch_down事件的子view,FLAG_DISALLOW_INTERCEPT表示子view设置是否允许事件被父容器截断
时间: 2024-10-10 05:01:37

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

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

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

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

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

Android View事件分发机制

最近在开发中遇到view滑动冲突的问题,由于一开始就知道这个问题与view事件分发有关,之后在网上看了几篇关于事件分发的资料后,开发中遇到的问题很快便得到解决. 在这里总结一下我对view事件分发的理解. 首先,看下事件分发流程图: Button事件演示 在对view的事件分发机制进行分析前,我们可以通过一个demo看看Button的事件处理的流程. 在布局文件中添加一个button控件,然后在代码中实现Button的setOnClickListener和setOnTouchListener方法

Android View 事件分发机制梳理

View初探 一直以来对View的事件分发机制很晕,今天就在这里梳理一下 MyView 首先继承View类,自定义一个MyView.并在初始化时打印View类是否可点击,这里从View点击事件分发的角度出发,所以不考虑绘制,测量相关方法的实现. public class MyView extends View { String TAG = "Activity"; public MyView(Context context) { super(context); init(); } pub

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触摸事件分发机制

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

Android ViewGroup事件分发机制

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39102591,本文出自[张鸿洋的博客] 上一篇已经完整的解析了Android View的事件分发机制,今天给大家代码ViewGroup事件分发的源码解析~~凡是自定义ViewGroup实现各种滑动效果的,不可避免的会出现很多事件的冲突,对ViewGroup事件分发机制的了解,也有益于大家了解冲突产生的原因,以及对冲突进行处理~ 1.案例 首先我们接着上一篇的代码,在代码中添加一

Android触摸事件分发机制完全解析《一》

最近在做高德地图的时候,由于用户的要求,不得不用ScrollVew嵌套MapView,虽然很官方要求不建议这样做,但也迫于无奈- 魔高一尺,道高一丈.有什么事情事程序员不能解决的,如果有那就是解决两次. 鉴于用到了触摸事件,于是就来总结了Android的触摸事件机制. 首先当用户进行屏幕操作的时候,则有两种情况 一是按键事件 二是触摸事件 按键事件分为长按和点击事件,过于简单,这里不再进行总结. 触摸事件 触摸事件的组成: - 一个actionDown - n个actionMove - 一个ac

android touch事件分发机制

转载请注明出处:http://blog.csdn.net/ZhouLi_CSDN/article/details/45878337 看了网上那么多的博客 ,对于android系统的事件处理仍然不是明白的特别透彻,或者一些博客讲解的总是有些歧义或者讲诉的不正确或者不全面.所以自己总结了一下事件的传递机制希望可以帮助到广大的朋友. 假设事件传送路径为A-B-C-D-E; 一个手势是由事件action_down开始和action_move等其它事件以及事件action_up结束的集合: 一个actio