前一阶段,在学习的时候,遇到了我觉得的我接触安卓以来的最多的一次事件拦截出来,那个项目,用到了slidemenu側滑菜单条,然后加上tab标签,还有轮播广告,listview上下滑动。viewpager的左右监听,假设没有处理各种事件的监听,那么就会一团糟。会让系统不知道究竟要响应你的哪一个事件,有了点启示。在这自己就写一个小的demo来分享一下事件的拦截机制。

我们想要了解事件拦截机制,我们首先来看下onInterceptTouchEvent这种方法:

onInterceptTouchEvent:

  • 负责对touch事件拦截。对于嵌套的view。最先运行的是所点击view的onInterceptTouchEvent,然后依次运行子视图中的onInterceptTouchEvent(这里没有做不论什么处理。假设全部嵌套视图的onInterceptTouchEvent都会得到运行。也就是默认的返回false)就是有事情了,总监先去处理,然后经理处理。然后员工处理。(父视图先处理事情),事件拦截成功的标志就是onInterceptTouchEvent的返回值。假设返回fasle,没有拦截成功,返回true,拦截成功。

首先来看下我的文件布局:(最上面是一个自己定义的view,中间的和以下的是两个自己定义的viewgroup)

布局非常easy:中间的和以下的那个是继承的RelativeLayout,最上面的继承的textview。

package com.example.touchintercept;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.RelativeLayout; /**
* Created by 若兰 on 2016/2/14.
* 一个懂得了编程乐趣的小白。希望自己
* 能够在这个道路上走的非常远,也希望自己学习到的
* 知识能够帮助很多其它的人,分享就是学习的一种乐趣
* QQ:1069584784
* csdn:http://blog.csdn.net/wuyinlei
*/ public class DirectorView extends RelativeLayout { private static String TAG = "wuyinlei";
public DirectorView(Context context) {
super(context);
} public DirectorView(Context context, AttributeSet attrs) {
super(context, attrs);
} public DirectorView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} @Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.d(TAG, "DirectorView onInterceptTouchEvent");
return false;
} @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.d(TAG, "DirectorView dispatchTouchEvent");
return super.dispatchTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent event) {
Log.d(TAG, "DirectorView onTouchEvent");
return super.onTouchEvent(event);
} }

其它的两个也是一样的,里面没有实现不论什么的逻辑。



我们首先来看下,什么处理都没有做的(仅仅是简单的写了onInterceptTouchEvent和onTouchEvent)

这个时候我们来点击textview。看看打印的log:

能够看见,正常的状况事件的传递顺序是:

  • 总监(DirectorView)–>经理(ManagerView)—>我(MyView)
  • 事件传递的时候。先运行dispatchTouchEvent方法然后运行onInterecptTouchEvent方法

事件处理的顺序是:

  • 我(MyView)–>经理(ManagerView)—>总监(DirectorView)
  • 这个就非常好理解了。比方说卖房的时候,假设买房的要的优惠在员工(我)的能力范围之内,那么我返回ture,把事件处理了,也就是拦截。假设超出了我的优惠范围,我就返回false。不拦截。继续到经理。一层一层的处理。
  • 初始情况都是返回false (dispatchTouchEvent方法我们一般不住处理的)

    我们来看下整个事件过程的图形说明:

总监处理事件

以下我们修改一下,假如一个买房的顾客和总监非常熟。那么他直接去找了总监。那么总监直接把优惠给了这个顾客。也就是事件不是必需往下传递了,这个时候我们仅仅须要修改DirectorView中的onInterecptTouchEvent方法返回true。我们看下log:



这个时候我们看下图形解释的拦截事件:

经理处理事件

在来看下一个场景,这个中产阶级的员工,去买房。他仅仅认识经理,那么他直接去找经理谈能给的优惠,而且两个人是好朋友,这个时候就会把他能给的最大优惠给这个买房的。这个时候我们调整ManagerView中的onInterecptTouchEvent方法返回true,我们看下log:



这个时候我们看下图形解释的拦截事件:

员工(我)处理事件

这个时候,想必对于事件的分发、拦截大家应该比較清楚了,这个时候我们再来看下底层的MyView.记得我们刚開始的时候,顺其自然,我们返回的是false。就是一级一级的往上报告。只是这个时候,过来了一个买房的,有钱,可是不认识经理和总监。当然了哈,他也不在乎钱,这个时候你就给了他自己能给的优惠,两方达成一致,有钱人买了一套房,你也不用向上级反映。这个时候我们返回true:



这个时候他们之间的关系图例如以下所看到的:



还有就是。假设经理在onTouchEvent中返回了true。那么事件传递到经理这里也就不传递了。就好比,员工做错了事情,经理一看。不想把自己员工丢人的事情让总监看。那么他就返回true:



这个时候他们之间的关系图例如以下所看到的:



相信通过这几步的分析,还是比較easy的了解事件的分发、拦截、处理机制的,假设想要进一步的了解,大家能够去结合一下源代码,然后在自己写一个demo演示,相信会有更深层的体会。

Android事件拦截机制简单分析的更多相关文章

  1. 讲讲Android事件拦截机制

    简介 什么是触摸事件?顾名思义,触摸事件就是捕获触摸屏幕后产生的事件.当点击一个按钮时,通常会产生两个或者三个事件--按钮按下,这是事件一,如果滑动几下,这是事件二,当手抬起,这是事件三.所以在And ...

  2. Android 事件拦截机制一种粗鄙的解释

    对于Android事件拦截机制,相信对于大多数Android初学者是一个抓耳挠腮难于理解的问题.其实理解这个问题并不困难. 首先,你的明白事件拦截机制到底是怎么一回事?这里说的事件拦截机制,指的是对触 ...

  3. Android事件分发机制源代码分析

    小小感慨一下,做android有一段时间了,一直以来都是习惯整理笔记存到有道笔记上,没有写博客的习惯. 以后逐步分类整理出来,也算"复习"一遍了 - _ - . android的事 ...

  4. Android事件拦截机制 - 两句话

    模拟情形:ViewGroupA ->ViewGroupB->View False往下走,True就停下.(适用于事件传递和事件处理)

  5. Android事件分发机制完全解析,带你从源码的角度彻底理解

    Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...

  6. Android事件传递机制(转)

    Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...

  7. Android事件传递机制详解及最新源码分析——ViewGroup篇

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 在上一篇<Android事件传递机制详解及最新源码分析--View篇>中,详细讲解了View事件的传递机制,没掌握或者掌握不扎实的小伙伴 ...

  8. Android事件分发机制源码分析

    Android事件分发机制源码分析 Android事件分发机制源码分析 Part1事件来源以及传递顺序 Activity分发事件源码 PhoneWindow分发事件源码 小结 Part2ViewGro ...

  9. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

随机推荐

  1. 移动端车牌识别sdk开发包(可下载)

    移动端车牌识别是一项基于OCR识别的应用技术.移动端车牌识别过程主要包含五个步骤,其中包括图像采集.图像预处理.车牌定位.字符分割.字符识别.输出结果等一系列计算机算法运算, 第一步[图像采集]:此步 ...

  2. copy11

    方法二 这种方法也比较简单,主要针对你没有.apk包的情况,比如Android原生自带的APP(计算器.通讯录.短信...),可以通过adb 命令. 1,打开APP. 2,执行> adb log ...

  3. Promise同时进入catch和then——踩坑

    记录今天使用Promise遇到的一个坑--在resolve()返回运行then之后,函数又进入到了catch,源代码大意如下: var pro = function() { return new Pr ...

  4. Lucene全文检索学习笔记

    全文索引 介绍Lucene的作者:Lucene的贡献者Doug Cutting是 一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后 ...

  5. C# WinForm程序添加启动画面

    如果程序在装载时需要进行较长时间的处理,最好使用启动画面,一方面美化程序,一方面可以不使用户面对着一片空白的程序界面. 我手头上一个小项目主界面启动时需要检查用户文件及运行环境是否有效,需要一段时间处 ...

  6. 比特币区块结构Merkle树及简单支付验证分析

    在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通 ...

  7. protobuf/android 交叉编译笔记

    protobuf 交叉编译笔记 目标是使用 android ndk 的工具链编译出 android armeabi-v7a 可用的 protobuf 库. 交叉编译环境配置 windows 平台 下载 ...

  8. Cordic算法——verilog实现

    上两篇博文Cordic算法--圆周系统之旋转模式.Cordic算法--圆周系统之向量模式做了理论分析和实现,但是所用到的变量依然是浮点型,而cordic真正的用处是基于FPGA等只能处理定点的平台.只 ...

  9. JavaScript数据可视化编程学习(二)Flotr2,雷达图

    一.雷达图 使用雷达图显示多维数据. 如果你有多维的数据要展示,那么雷达图就是一种非常有效的可视化方法. 由于雷达图不常用,比较陌生,所以向用户解释的时候有一些难度.注意使用雷达图会增加用户认知负担. ...

  10. replace() 所有单词首字母大写

    function ReplaceDemo() { var r,re; var s="The quick brown fox jumpe dover the lazy yellow dog.& ...