Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解
首先,看Android的官方文档正解
onInterceptTouchEvent()与onTouchEvent()的机制:
1. down事件首先会传递到onInterceptTouchEvent()方法
2. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,
那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最
终的目标view的onTouchEvent()处理
3. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,
那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样
传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
4. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一
层次的view的onTouchEvent()处理
5. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递
给该view的onTouchEvent()处理
这是官方文档的说法,要是自己没亲自去写个程序观察哈,基本上没法理解,所以上程序先,然后分析:
布局文件main.xml
- <span style="font-size: small;"><?xml version="1.0" encoding="utf-8"?>
- <com.hao.LayoutView1 xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <com.hao.LayoutView2
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent" android:gravity="center">
- <com.hao.MyTextView
- android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:id="@+id/tv" android:text="AB" android:textSize="40sp"
- android:textStyle="bold" android:background="#FFFFFF"
- android:textColor="#0000FF" />
- </com.hao.LayoutView2>
- </com.hao.LayoutView1>
- </span>
第一层自定义布局LayoutView1.java
- <span style="font-size: small;">package com.hao;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.widget.LinearLayout;
- public class LayoutView1 extends LinearLayout {
- private final String TAG = "LayoutView1";
- public LayoutView1(Context context, AttributeSet attrs) {
- super(context, attrs);
- Log.e(TAG,TAG);
- }
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- int action = ev.getAction();
- switch(action){
- case MotionEvent.ACTION_DOWN:
- Log.e(TAG,"onInterceptTouchEvent action:ACTION_DOWN");
- // return true; 在这就拦截了,后面的就不会得到事件
- break;
- case MotionEvent.ACTION_MOVE:
- Log.e(TAG,"onInterceptTouchEvent action:ACTION_MOVE");
- break;
- case MotionEvent.ACTION_UP:
- Log.e(TAG,"onInterceptTouchEvent action:ACTION_UP");
- break;
- case MotionEvent.ACTION_CANCEL:
- Log.e(TAG,"onInterceptTouchEvent action:ACTION_CANCEL");
- break;
- }
- return false;
- }
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- int action = ev.getAction();
- switch(action){
- case MotionEvent.ACTION_DOWN:
- Log.e(TAG,"onTouchEvent action:ACTION_DOWN");
- break;
- case MotionEvent.ACTION_MOVE:
- Log.e(TAG,"onTouchEvent action:ACTION_MOVE");
- break;
- case MotionEvent.ACTION_UP:
- Log.e(TAG,"onTouchEvent action:ACTION_UP");
- break;
- case MotionEvent.ACTION_CANCEL:
- Log.e(TAG,"onTouchEvent action:ACTION_CANCEL");
- break;
- }
- return true;
- // return false;
- }
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- // TODO Auto-generated method stub
- super.onLayout(changed, l, t, r, b);
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- // TODO Auto-generated method stub
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- }
- }</span>
第二层布局LayoutView2.java
- <span style="font-size: small;">package com.hao;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.widget.LinearLayout;
- public class LayoutView2 extends LinearLayout {
- private final String TAG = "LayoutView2";
- public LayoutView2(Context context, AttributeSet attrs) {
- super(context, attrs);
- Log.e(TAG,TAG);
- }
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- int action = ev.getAction();
- switch(action){
- case MotionEvent.ACTION_DOWN:
- Log.e(TAG,"onInterceptTouchEvent action:ACTION_DOWN");
- // return true;
- break;
- case MotionEvent.ACTION_MOVE:
- Log.e(TAG,"onInterceptTouchEvent action:ACTION_MOVE");
- break;
- case MotionEvent.ACTION_UP:
- Log.e(TAG,"onInterceptTouchEvent action:ACTION_UP");
- break;
- case MotionEvent.ACTION_CANCEL:
- Log.e(TAG,"onInterceptTouchEvent action:ACTION_CANCEL");
- break;
- }
- return false;
- }
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- int action = ev.getAction();
- switch(action){
- case MotionEvent.ACTION_DOWN:
- Log.e(TAG,"onTouchEvent action:ACTION_DOWN");
- break;
- case MotionEvent.ACTION_MOVE:
- Log.e(TAG,"onTouchEvent action:ACTION_MOVE");
- break;
- case MotionEvent.ACTION_UP:
- Log.e(TAG,"onTouchEvent action:ACTION_UP");
- break;
- case MotionEvent.ACTION_CANCEL:
- Log.e(TAG,"onTouchEvent action:ACTION_CANCEL");
- break;
- }
- // return true;
- return false;
- }
- }
- </span>
自定义MyTextView.java
- <span style="font-size: small;">package com.hao;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.TextView;
- public class MyTextView extends TextView {
- private final String TAG = "MyTextView";
- public MyTextView(Context context, AttributeSet attrs) {
- super(context, attrs);
- Log.e(TAG,TAG);
- }
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- int action = ev.getAction();
- switch(action){
- case MotionEvent.ACTION_DOWN:
- Log.e(TAG,"onTouchEvent action:ACTION_DOWN");
- break;
- case MotionEvent.ACTION_MOVE:
- Log.e(TAG,"onTouchEvent action:ACTION_MOVE");
- break;
- case MotionEvent.ACTION_UP:
- Log.e(TAG,"onTouchEvent action:ACTION_UP");
- break;
- case MotionEvent.ACTION_CANCEL:
- Log.e(TAG,"onTouchEvent action:ACTION_CANCEL");
- break;
- }
- return false;
- // return true;
- }
- public void onClick(View v) {
- Log.e(TAG, "onClick");
- }
- public boolean onLongClick(View v) {
- Log.e(TAG, "onLongClick");
- return false;
- }
- }
- </span>
其实代码很简单,就是自定义了View,在View里面都重写了interceptTouchEvnet (),和onTouchEvent(),然后测试其返回值,对监听的影响,关键是自己动手,逐个测试,并预测结果,等你能预测结果的时候,也就懂了,需要修改的地方就是interceptTouchEvnet 和onTouchEvent的返回值,他们决定了事件监听的流程,下面我画了一张图,如有不足之处欢迎指正,谢谢!
下面是我的正解:

下附源代码:
- TouchEventTest.rar (94.3 KB)
- 下载次数: 57
Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解的更多相关文章
- Android 事件模型
本文内容 基于监听的事件模型 基于回调的事件模型 Android 支持两种事件模型,基于监听的事件模型和基于回调的事件模型. 基于监听的事件模型 基于监听的事件模型是一种委托式的,更"面向对 ...
- Android事件机制之二:onTouch详解
<Android事件机制之一:事件传递和消费>一文总结了Android中的事件传递和消费机制. 在其中对OntachEvent中的总结中,不是很具体.本文将主要对onTach进行总结. o ...
- 对于android触摸事件模型的一些理解
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
Android事件分发机制可以说是我们Android工程师面试题中的必考题,弄懂它的原理是我们避不开的任务,所以长痛不如短痛,花点时间干掉他,废话不多说,开车啦 Android事件分发机制的发生在Vi ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
- 【朝花夕拾】Android自定义View篇之(五)Android事件分发机制(上)Touch三个重要方法的处理逻辑
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/10998855.html]谢谢! 在自定义View中,经常需要处理Android事件分发的问题, ...
- Android事件分发机制三:事件分发工作流程
前言 很高兴遇见你~ 本文是事件分发系列的第三篇. 在前两篇文章中,Android事件分发机制一:事件是如何到达activity的? 分析了事件分发的真正起点:viewRootImpl,Activit ...
- Android事件分发机制四:学了事件分发有什么用?
" 学了事件分发,影响我CV大法吗?" " 影响我陪女朋友的时间" " ..... " 前言 Android事件分发机制已经来到第四篇了,在 ...
- 讲讲Android事件拦截机制
简介 什么是触摸事件?顾名思义,触摸事件就是捕获触摸屏幕后产生的事件.当点击一个按钮时,通常会产生两个或者三个事件--按钮按下,这是事件一,如果滑动几下,这是事件二,当手抬起,这是事件三.所以在And ...
随机推荐
- HTML5 标准属性 NEW:HTML 5 中新的标准属性。 注释:HTML 4.01 不再支持 accesskey 属性:
属性 值 描述 accesskey character 规定访问元素的键盘快捷键 class classname 规定元素的类名(用于规定样式表中的类). contenteditable true f ...
- PHP 字符串处理 总结
PHP 字符串处理 PHP 字符串处理 PHP 的字符串处理功能非常强大,主要包括: 字符串输出 echo():输出一个或多个字符串 print():输出一个字符串 printf():输出格式化字符串 ...
- JSON 数组格式
JSON 数据格式 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人 ...
- zepto API参考(~~比较全面)
Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api. 如果你会用jquery,那么你也会用zepto. 设计的目的是提供jquery的类似的APIs ...
- 基于visual Studio2013解决C语言竞赛题之0403字符统计
题目 解决代码及点评 这道题的目标是锻炼while循环,while循环的语法是 while(循环条件) { 循环体; } 每次进入循环体之前,先判断循环条件是否满足,如果不满足,执行序列就 ...
- 【转】 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比
梯度下降(GD)是最小化风险函数.损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路,下面从公式和实现的角度对两者进行分析,如有哪个方面写的不对,希望网友纠正. 下面的h(x)是要拟 ...
- Drainage Ditches(最大流)
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64044 Accepted: 2471 ...
- Spout的实现步骤
Spout的实现步骤: · 对文件的改变进行分开的监听,并监视文件夹下有无新日志文件加入. · 在数据得到了字段的说明后,将其转换成tuple. · 声明Sp ...
- 为joomla加入�下拉菜单的方法
用 Joomla! 建站的大多数站长都须要在站点前台使用下拉菜单(dropdown menu),或者叫弹出菜单(slide menu),由于这样能够在有限的页面空间上公布很多其它的导航菜单,而且能够进 ...
- C# L该系统的应用istView简单的图像浏览器
最近有同学问我怎么用ListView加载图像列表,在...前面"C#系统中的应用"于TreeView+ListView+ContextMenuStrip控件实现树状图显示磁盘文件夹 ...