AndroidTouch事件总结
1、自定义的控件几乎都要用到触摸事件,不交互怎么响应,相关的事件处理函数由dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent,处理这些事件的由view,viewGroup,和activity

解释:虽然view可以dispatch和intercept,但是如果view是最小单元,那么就没法使用这两个方法了.
2、一个简单的activity,contentview如下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> </RelativeLayout>
它的view层次如下所示:

3、对touch的派发规律
(1)interceptTouchEvent定义是否截取Touch消息,若在GroupView中想要处理Touch消息必须覆盖此方法
(2)消息在dispatch过程中,若子view的dispatchTouchEvent返回true,父view不再处理这个消息
(3)viewGroup的interceptTouchEvent一但返回true,消息将不再派发给子view。
4、实例测试:
(1)测试布局:
<com.example.testtouch.MyRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:id="@+id/parent"
tools:context=".MainActivity" > <com.example.testtouch.MyChildView
android:id="@+id/child1"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="#0000ff" /> <View
android:layout_width="200dp"
android:layout_height="200dp"
android:background="#00ff00"/> <Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击"/>
</com.example.testtouch.MyRelativeLayout>
由此可以绘制出view树:

(2)对于dispatch事件:测试一:点击viewgroup:

测试二:点击MyChildView

测试三:在MyRelativeLayout中对dispatch事件返回true

测试四:在MyChildView中对dispatch返回true

对于dispatch事件:一直传递到最末端,如果
(3)对于onIntercept事件,测试一:MyRelativeLayout中对onIntercept事件返回false.

返回false后,当前控件不再处理touch事件,调用子控件的dispatchTouch事件和子控件的touch事件
测试二:MyRelativeLayout中对onIntercept事件返回true.

返回true后,当前控件处理touch事件,并传给上一上一层处理,touch的传递就会结束
(4)对于onTouch事件:测试一,MyRelativeLayout中OnTouch什么时候处理,最子元素MyChildView调用super.onTouchEvent(event)时候,

可以看到,onTouch事件首先传到最子元素,如果子元素调用super.onTouchEvent(event),会传递到父元素,并一层层往上传
如果子元素的onTouch事件返回false

可以看到,如果最里层元素返回false,和上边的处理一样,就会调用父元素的onTouchEvent
如果子元素的onTouch事件返回true

返回true表明该元素对touch事件做了处理,父元素无需再处理,就不再往上传了。
测试二:MyRelativeLayout对onInterceptTouchEvent返回true,对touch事件进行截获

对touch事件截获之后,touch事件会在当前层进行处理,不再传忘子元素。
如果截获后,当前层的onTouchEvent返回false

返回false后,自动调用上一层的onTouch事件。
如果截获后,当前层的OnTouch事件返回true

当前层返回true后,表明当前层不希望父元素再进行处理touch事件,中断了touch事件往父元素的路由。
总结:ViewGroup层处理Touch事件的总体逻辑是:先检测是否需要拦截,没有拦截的话下发给子View处理,如果子View没有处理再自行处理,自行处理的逻辑与View一样。
AndroidTouch事件总结的更多相关文章
- JNI详解---从不懂到理解
转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...
- android 面试事件分发
开始的Activity和最好的view是没有onInterceptTouchEvent方法的 不能进行对事件的拦截 总论 在我们点击屏幕时,会有下列事件发生: Activity调用dispathTou ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- 关于 Chrome 浏览器中 onresize 事件的 Bug
我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- C++中的事件分发
本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...
- 移动端IOS点击事件失效解决方案
解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...
- Android笔记——Button点击事件几种写法
Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...
- HTML 事件(一) 事件的介绍
本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...
随机推荐
- 大数据 > 数据平台方案评估
分类 当前措施 说明 百度竞价如何进行数据分析(SEM工程师)数据来源: 1. 百度后台推广数据:api 总展现 总点击 点击率 总消费 点击均价 BDP功能点 1. 串联百度->网站商务通-& ...
- async和await
总结下博客园中看到的async和await public static class TaskAsyncHelper { /// <summary> /// 将一个方法function异步运 ...
- mysql查看修改字符集
1.列出MYSQL支持的所有字符集: SHOW CHARACTER SET; 2.当前MYSQL服务器字符集设置 SHOW VARIABLES LIKE 'character_set_%'; 3.当前 ...
- Codeigniter文件上传类型不匹配错误
Codeigniter的文件上传类方便了我们使用PHP来处理文件上传的操作,使用起来非常简单,如下: $config['upload_path'] = './uploads/'; $config[ ...
- [转]NandFlash和NorFlash的区别
一. NAND和NOR的比较 NOR和NAND是现在市场上两种主要的非易失闪存技术.Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM 和EEPROM一统天下的局面.紧 ...
- SLAM初探-SLAM for Dummies
SLAM综述性特别是原理讲述比较浅显易懂的的资料比较少,相对比较知名的是<SLAM for Dummies>,但中文资料相对较少,这里就简单概述一下<SLAM for Dummies ...
- 浅谈一下关于iscroll的使用心得
因为最近的项目所有页面老板想做成苹果原生那种上下拉动有回弹效果的体验,浏览器自带是没有这种功能的,自己写的话兼容性可能会出大问题,要适配安卓的各种机型实在是难,所以我还是选择去使用移动端相对比较稳定的 ...
- 【开园 and 计划】
开园 啊啊啊啊啊啊啊啊,郁闷啊,头一回写博客,一刻钟前保存的草稿为何荡然无存??? 那少废话直击要点:今日乃我开园之日,开园为了改变.为了学习.为了积累. 计划 最长为时 3月,截止到 2016年9月 ...
- (十七)linux网络命令 vconfig ifconfig
增删VLAN vconfig add eth0 10 vconfig rem eth0.10重启网卡 ifconfig eth0.101 up ifconfig eth0.10 ...
- A*算法 -- 八数码问题和传教士过河问题的代码实现
前段时间人工智能的课介绍到A*算法,于是便去了解了一下,然后试着用这个算法去解决经典的八数码问题,一开始写用了挺久时间的,后来试着把算法的框架抽离出来,编写成一个通用的算法模板,这样子如果以后需要用到 ...