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





0 0