Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)
ViewGroup
View
Activity dispatchTouchEvent
有
有
有 onInterceptTouchEvent
有
无
无 onTouchEvent
有
有
有
例子零: 只有OnTouch和OnItemClick
actualListView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
return false; //这儿是true,下面是false,onItemClick会走
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
return true; //上面随意,只要这个地方返回true,onItemClick就不会走
}
return false;
}
});
actualListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this, "setOnClickListener",
Toast.LENGTH_SHORT).show();
}
});
例子一: 只有OnTouch和OnItemClick
actualListView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
break;
}
return false; //返回false之后
}
});
actualListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "setOnClickListener", Toast.LENGTH_SHORT).show();
}
});
先走ACTION_DOWN,ACTION_UP,最后走onItemClick。
例子二:只有OnTouch和OnItemClick
actualListView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
break;
}
return true; //返回true之后
}
});
actualListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "setOnClickListener", Toast.LENGTH_SHORT).show();
}
});
先走ACTION_DOWN,ACTION_UP, onItemClick不走
例子三:只有OnTouch和OnItemClick和dispatchTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
break; case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
break;
} return super.dispatchTouchEvent(ev);
}
actualListView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
break;
}
return false; //返回false之后
}
});
actualListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "setOnClickListener", Toast.LENGTH_SHORT).show();
}
});
先走dispatchTouchEvent的ACTION_DOWN------------>OnTouch的ACTION_DOWN------------->dispatchTouchEvent的ACTION_UP
----------------->OnTouch的ACTION_UP----------------->onItemClick
例子四:只有OnTouch和OnItemClick和dispatchTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
break; case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
break;
} return super.dispatchTouchEvent(ev);
}
actualListView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
break;
}
return true; //返回true之后
}
});
actualListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "setOnClickListener", Toast.LENGTH_SHORT).show();
}
});
先走dispatchTouchEvent的ACTION_DOWN------------>OnTouch的ACTION_DOWN------------->dispatchTouchEvent的ACTION_UP
----------------->OnTouch的ACTION_UP
例子五:只有OnTouch和OnItemClick和dispatchTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
return true; //这儿无论是true还是false,都会导致OnTouch和OnItemClick不走,因为没有下面的super来分发事件在activity中的操作 case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
return true; //这儿无论是true还是false,都会导致OnTouch和OnItemClick不走,因为没有下面的super来分发事件在activity中的操作
}
return super.dispatchTouchEvent(ev);
}
actualListView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
break;
}
return false; //返回false之后
}
});
actualListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "setOnClickListener", Toast.LENGTH_SHORT).show();
}
});
先走dispatchTouchEvent的ACTION_DOWN---------------------->dispatchTouchEvent的ACTION_UP
例子六:有OnTouch和OnItemClick 和 dispatchTouchEvent和onTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
break;
} return super.dispatchTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent event) {
Toast.makeText(MainActivity.this, "EveUP",
Toast.LENGTH_SHORT).show();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "Event DOWN",
Toast.LENGTH_SHORT).show();
return true;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "Event UP",
Toast.LENGTH_SHORT).show();
return true;
}
return super.onTouchEvent(event);
} Button button = (Button) findViewById(R.id.go_shopping);//这儿改为CLICKABLE的imageview结果一样
button.setOnTouchListener(new OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
return false; //这儿是true,下面是false,onItemClick会走 case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
return false; //上面随意,只要这个地方返回true,onItemClick就不会走
}
return false;
}
});
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "setOnClickListener",
Toast.LENGTH_SHORT).show();
}
});
先走dispatchTouchEvent的ACTION_DOWN------------>OnTouch的ACTION_DOWN------------->dispatchTouchEvent的ACTION_UP
----------------->OnTouch的ACTION_UP------------>OnClickListener
activity的伪生命周期onTouchEvent没有走,是因为button的onTouchEvent把事件消费了,
例子七:有OnTouch和OnItemClick 和 dispatchTouchEvent和onTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
break;
} return super.dispatchTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent event) {
Toast.makeText(MainActivity.this, "EveUP",
Toast.LENGTH_SHORT).show();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "Event DOWN",
Toast.LENGTH_SHORT).show();
return true;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "Event UP",
Toast.LENGTH_SHORT).show();
return true;
}
return super.onTouchEvent(event);
} Button button = (Button) findViewById(R.id.go_shopping); //这儿改为imageview结果一样
button.setOnTouchListener(new OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
return false; //这儿是true,下面是false,onItemClick会走 case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
return true; //上面随意,只要这个地方返回true,onItemClick就不会走
}
return false;
}
});
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "setOnClickListener",
Toast.LENGTH_SHORT).show();
}
});
先走dispatchTouchEvent的ACTION_DOWN------------>OnTouch的ACTION_DOWN------------->dispatchTouchEvent的ACTION_UP
----------------->OnTouch的ACTION_UP
button的OnClickListener没走,是因为onTouch 在ACTION_UP中返回true,把事件给消费了,导致button的onTouchEvent没走,连带的button的OnClick
也没有走。
activity的伪生命周期onTouchEvent没有走,是因为button的onTouch把事件消费了。
例子八:有 dispatchTouchEvent和onTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
break;
} return super.dispatchTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent event) {
Toast.makeText(MainActivity.this, "EveUP",
Toast.LENGTH_SHORT).show();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "Event DOWN",
Toast.LENGTH_SHORT).show();
return true;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "Event UP",
Toast.LENGTH_SHORT).show();
return true;
}
return super.onTouchEvent(event);
} Button button = (Button) findViewById(R.id.go_shopping);
//不给button设置ontouch和onclick
先走dispatchTouchEvent的ACTION_DOWN----------------->dispatchTouchEvent的ACTION_UP
activity的伪生命周期onTouchEvent没有走,是因为button的dispatchTouchEvent------>onTouchEvent把事件消费了。即使没有ontouch,事件也会被
button给消费掉
viewgroup(listview)和view(button)一样,其onTouchEvent会把事件给消费了,和view(imageview)不一样。
要想activity的伪生命周期onTouchEvent可以走的话,可以把button改为imageview,因为imageview不是“可按的CLICKABLE”,所以会imageview的onTouchEvent会return个false,不会消费掉这个事件
会先走dispatchTouchEvent的ACTION_DOWN------------>onTouchEvent的ACTION_DOWN------------->dispatchTouchEvent的ACTION_UP
----------------->onTouchEvent的ACTION_UP
点击一个ViewGrounp中的Button,事件的传递
Activity的dispatchTouchEvent(返回true或false都会导致事件不会分发,要返回super)----->ViewGrounp的dispatchTouchEvent-------->ViewGrounp的onInterceptTouchEvent()(返回false不拦截)--------->Button的dispatchTouchEvent------------->Button的setOnTouchListener(在up/down时如果返回false)------------->Button的onTouchEvent默认返回true消费事件(imageview默认返回false,事件会向上传/第二个事件的传递看我的另一个文章Android Touch事件传递机制 二)------>Button的setOnClickListener(在onTouchEvent中的up时调用)
Activity的dispatchTouchEvent(返回true或false都会导致事件不会分发,要返回super)----->ViewGrounp的dispatchTouchEvent-------->ViewGrounp的onInterceptTouchEvent()(返回false不拦截)--------->Button的dispatchTouchEvent------------->Button的setOnTouchListener(在up/down时如果返回true)消费事件结束
Activity的dispatchTouchEvent(返回true或false都会导致事件不会分发,要返回super)----->ViewGrounp的dispatchTouchEvent-------->ViewGrounp的onInterceptTouchEvent()(返回false不拦截)--------->Button的dispatchTouchEvent(Button的setOnTouchListener为null)------------->Button的onTouchEvent默认返回true----------->Button的setOnClickListener(在onTouchEvent中的up时调用)
Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)的更多相关文章
- Android Touch事件传递机制 二:单纯的(伪生命周期)
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- Android Touch事件传递机制 二:单纯的(伪生命周期) 这个清楚一点
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- Android Touch事件传递机制引发的血案
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38942135 关于Android Touch事件传递机制我之前也写过两篇文章,自觉得对Tou ...
- Android Touch事件传递机制详解 下
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...
- Android Touch事件传递机制具体解释 下
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...
- Android touch 事件传递机制
前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...
- Android Touch事件传递机制通俗讲解
在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成: 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给 ...
- Android Touch事件传递机制具体解释 上
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/37961997 近期总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,曾经 ...
- Android Touch事件传递机制详解 上
最近总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,以前也花时间学习过Android Touch事件的传递机制,可以每次用起来的时候总是忘记了,索性自己总结一下写篇文章避免以后忘 ...
随机推荐
- Extend Volume 操作 - 每天5分钟玩转 OpenStack(56)
前面我们讨论了 volume 的 attach 和 detach 操作,今天讨论如何扩大 volume 的容量.为了保护现有数据,cinder 不允许缩小 volume. Extend 操作用于扩大 ...
- 完全抽离WebAPi之特殊需求返回HTML、Css、JS、Image
前言 今天我们来实现一个特殊的需求,这个需求说来也不过分,不过有点违背WebAPi的真实用途,WebAPi不过是作为传输数据而用,若非在项目开发中断不可想到还要实现一个页面来实时显示列表并进行后续其他 ...
- 初探nodeJS
一.node概要 对nodeJS早有耳闻,但是一直迟迟没有对它下手,哈哈哈,今儿咱就来初探一下它. nodeJS是个啥东东? nodeJS,我的理解就是可以运行在后端的JavaScript. 为什么它 ...
- 构建自己的PHP框架--定义ORM的接口
在上一篇博客中,我们抽象出了Controller的基类,实现了页面的渲染和返回JSON字符串的功能. 那作为一个框架,我们现在还缺少什么?是的,大家应该已经注意到了,我们在这之前从来没有连接过数据库, ...
- mac+php+xdebug+phpstorm在苹果下配置xdebug一波三折
1.下载xdebug文件 http://xdebug.org/wizard.php 将phpinfo()的源代码复制到文本框中,xdebug会提示如何配置和下载哪个版本的xdebug. 全部下载地址: ...
- C语言 第六章 多重循环
一.概要 在c语言中,if,switch,for,while,do-while可以相互间多次嵌套. if(){ for() { for() { } } } while() { for(){ } for ...
- JavaWeb路径问题打包总结--小心出门右转404
话说,培训和自学就不是一个回事,两周讲完java基础,两天讲完jsp,两节课讲完servlet,还真不是一般人能受得了的,这两天学习jsp和servlet频繁被路径问题困扰,倒不是出错,只是各种act ...
- (1)从底层设计,探讨插件式GIS框架的实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 研一时,听当时的师兄推荐,买了蒋波涛的一本关于GIS插件框架的书.当时 ...
- AngularJS中的JSONP实践
欢迎大家指导与讨论: ) 概念 首先呢,Json和JSONP是不一样的哦.Json呢,是众多数据存储的其中一种格式,是数据书写方式的其中一种.好比是大中华众多诗体的一种(比如说是七言诗吧).这种诗体规 ...
- 关系数据库常用SQL语句语法大全
创建表 语法 CREATE TABLE <表名>(<列名> <数据类型>[列级完整性约束条件] [,<列名> <数据类型>[列级完整性约束条 ...