android 事件传递
来源:互联网 发布:腾讯体育直播for mac 编辑:程序博客网 时间:2024/06/05 04:31
假如dispatchTouchEvent返回false,那么在响应了ACTION_DOWN之后,后续的ACTION_MOVE和ACTION_UP均忽略,因此ACTION_MOVE和ACTION_UP永远不会有得到处理的机会。
类ViewGroup --View
ViewGroup
dispatchTransformedTouchEvent
if (child == null) {
handled = super.dispatchTouchEvent(event);
} else {
handled = child.dispatchTouchEvent(event);
}
View
dispatchTouchEvent
if (!result && onTouchEvent(event)) {
result = true;
}
onTouchEvent
switch (action) {
case MotionEvent.ACTION_UP:
if (!focusTaken) {
// Use a Runnable and post this rather than calling
// performClick directly. This lets other visual state
// of the view update before click actions start.
if (mPerformClick == null) {
mPerformClick = new PerformClick();
}
if (!post(mPerformClick)) {
performClick();//调用liseten的clickli 代码:mOnClickListener.onClick(this);
}
}
case MotionEvent.ACTION_Down:
….
layout1包含layout2,layout2包含view
layout1:
public boolean dispatchTouchEvent(MotionEvent ev)
{
boolean b= super.dispatchTouchEvent(ev);
SyncLog.log("layout1 ","" + b+" "+ev.getAction());
return true;
}
public boolean onInterceptTouchEvent(MotionEvent ev)
{
return false;
}
layout2:
public boolean dispatchTouchEvent(MotionEvent ev)
{
boolean b = super.dispatchTouchEvent(ev);
SyncLog.log("layout2 ", b + " " + ev.getAction());
return false;
}
public boolean onInterceptTouchEvent(MotionEvent ev)
{
SyncLog.log("layout1 onInterceptTouchEvent "," "+ev.getAction());
return false;
}
layout1的onInterceptTouchEvent 返回false
结果:
05-06 03:41:06.598 1255-1255/? E/layout1 onInterceptTouchEvent﹕ 0
05-06 03:41:06.598 1255-1255/? E/layout2﹕ true 0 motion down
05-06 03:41:06.598 1255-1255/? E/layout1﹕ true 0
05-06 03:41:08.058 1255-1255/? E/layout1﹕ true 1 motion up
05-06 03:41:08.062 1255-1255/? E/layout1=-------﹕ asdf1 触发layout1的onclick
layout1的onInterceptTouchEvent 返回true
结果:
05-06 03:42:35.058 3704-3704/com.event.tessssss E/layout1﹕ true 0
05-06 03:42:36.594 3704-3704/com.event.tessssss E/layout1﹕ true 1
05-06 03:42:36.598 3704-3704/com.event.tessssss E/layout1=-------﹕ asdf1
结论 onInterceptTouchEvent如果是true就不会再往下派发。这个只影响是否分发出去,是否消费事件是由dispatchTouchEvent返回决定,true是消费,false不消费
public boolean dispatchTouchEvent(MotionEvent ev)
{
boolean b= super.dispatchTouchEvent(ev);
SyncLog.log("layout1 ","" + b+" "+ev.getAction());
return false;
}
public boolean onInterceptTouchEvent(MotionEvent ev)
{
return true;
}
结果:
05-06 03:59:28.170 11444-11444/com.event.tessssss E/layout1﹕ true 0 down
如果onInterceptTouchEvent为false,dispatchTouchEvent不管返回什么都会往下分发。
- android 事件传递机制
- android 事件传递机制
- android触摸事件传递
- android事件传递机制
- android 事件传递
- Android触摸事件传递
- Android事件传递机制
- Android 事件传递机制
- android 事件的传递
- Android事件传递机制
- Android中的事件传递
- Android事件传递机制
- Android事件传递机制
- Android事件传递机制
- Android事件传递机制
- Android事件传递机制
- Android事件传递机制
- android touch事件传递
- 感冒交叉感染
- linux源码Makefile的详细分析
- 一个安全论坛挺好的
- c++ Oracle OCCI 编程
- 编程之禅 浅谈封装
- android 事件传递
- javaweb报表制作学习
- 记录jquery.ajax()(自用)
- cocos2dx 3.8加载cocos studio csb文件
- Android Studio修改包名
- 1073. Scientific Notation (20)
- 导出类的注意事项
- 关于HTTP
- Dialog屏蔽Esc按键