android 事件传递
2016-06-17 10:00
555 查看
假如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不管返回什么都会往下分发。
类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不管返回什么都会往下分发。
相关文章推荐
- android6.0源码分析之Runtime的初始化
- mac 上 卸载 android studio
- 轻松实现Android仿淘宝地区选择功能
- Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
- Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
- [Android官方Demo系列] PageTransformer潜藏滑动
- Android消息传递之组件间传递消息(二)
- Android Dialog
- android应用程序第12课:RelativeLayout
- android使用微软EWS发送邮件
- Android 用代码设置Shape,corners,Gradient
- 毛玻璃之android.support.v8.renderscript.RSRuntimeException
- Android实战技巧:ViewStub的应用
- Android Menu
- android应用程序第10课:ImageView
- Android 之nineoldandroids ViewHelper实现动画效果
- android系统服务(service)
- Android中Matrix动画
- Android surfaceview详解
- windows平台下Android studio开发环境搭建教程