您的位置:首页 > 移动开发 > Android开发

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不管返回什么都会往下分发。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: