首页 技术 正文
技术 2022年11月12日
0 收藏 713 点赞 2,763 浏览 1942 个字

事件的分发与传递最重要的三个处理方法是

dispatchTouchEvent

onInterceptTouchEvent

onTouchEvent

综合来说事件的 传递是由外层向里层传递,而处理是从里层往外层处理

1 , 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)

Touch事件发生时Activity的dispatchTouchEvent(MotionEvent ev)方法会将事件传递给最外层View的dispatchTouchEvent(MotionEvent ev)方法,该方法对事件进行分发。分发逻辑如下:
    如果return true,事件会由当前View的dispatchTouchEvent方法进行消费,同时事件会停止向下传递;

如果return false,事件分发分为两种情况:
      如果当前 View 获取的事件直接来自 Activity,则会将事件返回给Activity的onTouchEvent进行消费;
      如果当前 View 获取的事件来自外层父控件,则会将事件返回给父View的onTouchEvent进行消费。

如果return super.dispatchTouchEvent(ev),事件分发分为两种情况:

     如果当前View是ViewGroup,则事件会分发给onInterceptTouchEvent方法进行处理;

     如果当前View是普通View,则事件直接交给onTouchEvent方法进行处理

   2, 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)

此方法只有ViewGroup才有, Activity与普通View没有。上面已经提到,如果当前ViewGroup的dispatchTouchEvent(事件分发)返回super.dispatchTouchEvent(ev), 那么事件会传递到传递到       onInterceptTouchEvent方法, 该方法对事件进行拦截。拦截逻辑如下:
    如果return true,则表示拦截该事件,并将事件交给当前View的onTouchEvent方法;

如果return false,则表示不拦截该事件,并将该事件交由子View的dispatchTouchEvent方法进行事件分发,重复上述过程;

如果return super.onInterceptTouchEvent(ev), 事件拦截分两种情况:       

       如果该View(ViewGroup)存在子View且点击到了该子View, 则不拦截, 继续分发给子View 处理, 此时相当于return false。

     如果该View(ViewGroup)没有子View或者有子View但是没有点击中子View(此时ViewGroup相当于普通View), 则交由该View的onTouchEvent响应,此时相当于return true。

一般的LinearLayout、 RelativeLayout、FrameLayout等ViewGroup默认不拦截, 而ScrollView、ListView等ViewGroup则可能拦截,得看具体情况。

 3, 事件响应:public boolean onTouchEvent(MotionEvent ev)

上面已经提到,在dispatchTouchEvent(事件分发)返回super.dispatchTouchEvent(ev)并且onInterceptTouchEvent进行拦截(事件拦截返回true)的情况下,那么事件会传递到onTouchEvent       方法,该方法对事件进行响应。响应逻辑如下:
    如果return true,则表示响应并消费该事件;
    如果return fasle,则表示不响应事件,那么该事件将会不断向上层View的onTouchEvent方法传递,直到某个View的onTouchEvent方法返回true,如果到了最顶层View还是返回false,那么认为该事件不消耗,则在同一个事件系列中,当前View无法再次接收到事件,该事件会交由Activity的onTouchEvent进行处理;
    如果return super.dispatchTouchEvent(ev),事件处理分为两种情况:

    如果该View是clickable或者longclickable的,则会返回true, 表示消费了该事件, 与返回true一样;

    如果该View不是clickable或者longclickable的,则会返回false, 表示不消费该事件,将会向上传递,与返回false一样.

如下流程图:

android的事件分发传递机制

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,490
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,905
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,738
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,491
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,129
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,292