android 事件传递

假如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不管返回什么都会往下分发。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值