Android事件分发原理
终于用上了word 2013来写博客,感觉真是老好了,以前在网页上写,老是要把网页拖上拖下的,每次都要吐一升老血啊,现在用上本地的word,瞬间感觉好多了。还有感谢为word写插件的这个大神,代码高亮真是不错。
上一次写了android按钮点击事件是怎么执行的,涉及到了android的touch 和 click事件,粗略地看了一下源码,解释了一下android Touch和Click事件的流程。这一次,我要继续记录我从Tinera和郭大神那里学习到的知识,自己动手实践一番。
首先,上次说到,当你点击一个按钮的时候,你的ACTION_DOWN事件会被dispatch到你点击的按钮的dispatchTouchEvent()方法,那么我们不禁要想,如果我要在一个按钮父布局里面也放一个touch或者click方法,那么点击这个按钮,会不会调用这个父布局的相应的代码呢?
我们来实验一下:
我们看到,外层的touch事件是不会抢走内层的touch事件的,同样click也是如此。那么dispatchTouchEvent()事件是从里面往外面传的喽,当然不是得,现在只需要知道,传递是从外层往内层传的,只是外层的布局事件没有"阻拦"这个事件的传递而已。
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
Log.d("MainActivity", "touch called");
return true;
}
});
relativeLayout1.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
Log.d("MainActivity", "relative touch called");
return false;
}
});
我定义了一个MyLayout,在其里面画上一个按钮,然后为他们俩都注册了touch事件,然而只有按钮触发了。
那么为什么说事件是从外往里面传递的呢,这不是说不通吗?既然MyLayout首先接收了事件,为什么要传递,而不是自己处理呢,等等,自己处理就坏了,你点击按钮,然后
被外面的这个viewGroup响应调了,有什么用啊。因此我们要想为什么是从外层往里层而不是从里层往外面传递?好吧,先来实验一下,我们在MyLayout里面重新写一下
onInterceptTouchEvent()这个函数,这个函数在viewgroup里面,默认返回false的,并且只有一句返回。它有什么用呢,先来来看看ViewGroup的dispatchTouchEvent()方法
Android事件分发原理的更多相关文章
- Android View 的事件分发原理解析
作为一名 Android 开发者,每天接触最多的就是 View 了.Android View 虽然不是四大组件,但其并不比四大组件的地位低.而 View 的核心知识点事件分发机制则是不少刚入门同学的拦 ...
- Android事件分发机制(上)
Android事件分发机制这个问题不止一个人问过我,每次我的回答都显得模拟两可,是因为自己一直对这个没有很好的理解,趁现在比较闲对这个做一点总结 举个例子: 你当前有一个非常简单的项目,只有一个Act ...
- [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...
- android事件分发(二)
非常早之前写过一篇android事件分发的博客,主要写的是它是怎样分发的,具体非常多原理的东西都没有涉及到.今天就从源代码看android怎样控制它的分发机制. 鉴于手机屏幕的限制,所以android ...
- 【朝花夕拾】Android自定义View篇之(七)Android事件分发机制(下)滑动冲突解决方案总结
前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/11072989.html],谢谢! 前面两篇文章,花了很大篇幅讲解了Android的事件分发机制 ...
- 你真的看懂Android事件分发了吗?
引子 Android事件分发其实是老生常谈了,但是说实话,我觉得很多人都只是懂其大概,模棱两可.本文的目的就是再次从源码层次梳理一下,重点放在ViewGroup的dispatchTouchEvent方 ...
- Android事件分发与责任链模式
一.责任链模式 责任链模式是一种行为模式,为请求创建一个接收者的对象链.这样就避免,一个请求链接多个接收者的情况.进行外部解耦.类似于单向链表结构. 优点: 1. 降低耦合度.它将请求的发送者和接收者 ...
- Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
Android事件分发机制可以说是我们Android工程师面试题中的必考题,弄懂它的原理是我们避不开的任务,所以长痛不如短痛,花点时间干掉他,废话不多说,开车啦 Android事件分发机制的发生在Vi ...
- Android事件分发机制四:学了事件分发有什么用?
" 学了事件分发,影响我CV大法吗?" " 影响我陪女朋友的时间" " ..... " 前言 Android事件分发机制已经来到第四篇了,在 ...
随机推荐
- php实现自动运行文件
autoexec.php <?php ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. set_time_limit(30); // ...
- jqueryrotate 使用 帮助 笔记 学习
1.想变角度 $("imgID").rotate(45); 2.想变角度时,有运动过程 $("imgID").rotate({animateTo:45} ...
- Android 签名(7)签名常见问题,debug签名和release签名的区别等
一般在安装时提示出错:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 1) 两个应用,名字相同,签名不同 2) 升级时前一版本签名,后一版本没签名 3) ...
- CodeWars题目筛选
http://www.codewars.com/kata/search/csharp?q=&r%5B%5D=-8&xids=completed&beta=false 语言选择C ...
- 1650. Billionaires(线段树)
1650 简单题 线段树的单点更新 就是字符串神马的 有点小繁琐 开两个map 一个存城市 一个存名字 #include <iostream> #include<cstdio> ...
- JXL读取Excel日期时间不准确
XL读取Excel日期时间多出了8个小时. Cell c = rs.getCell(j, i); if (c.getType() == CellType.DAT ...
- [ahu 1248] NBA Finals
NBA Finals Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MBTotal Submission: 251 ...
- 使用Amoeba 实现MySQL DB 读写分离
Amoeba(变形虫)项目是一个开源框架,于2008年开始发布一款 Amoeba for Mysql软件: 这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQ ...
- RPi 2B 中文语言包
/************************************************************************* * RPi 2B 中文语言包 * 声明: * 本文 ...
- jquery自动焦点图
效果预览:http://runjs.cn/detail/vydinibc 带左右箭头的自动焦点图:http://runjs.cn/detail/wr1d1keh html: <div clas ...