今天,看了顧浩鑫的android高階高階這本書,了解了activity、view、viewgroup的事件傳遞機制,一次完整的事件傳遞主要包括三個階段:事件的分發(dispatch)、攔截(intercept)和消費(consume)。
package com.asce1885.viewdemo;
import android.content.context;
import android.util.attributeset;
import android.util.log;
import android.view.motionevent;
import android.widget.relativelayout;
/** * created by guhaoxin on 16/3/28.
*/public class myrelativelayout extends relativelayout
public myrelativelayout(context context, attributeset attrs)
@override
public boolean dispatchtouchevent(motionevent ev)
return super.dispatchtouchevent(ev);
}//攔截
@override
public boolean onintercepttouchevent(motionevent ev)
return false;
}@override
public boolean ontouchevent(motionevent event)
return super.ontouchevent(event);
}}
package com.asce1885.viewdemo;
import android.content.context;
import android.util.attributeset;
import android.util.log;
import android.view.motionevent;
import android.widget.relativelayout;
/** * created by guhaoxin on 16/3/28.
*/public class myrelativelayout extends relativelayout
public myrelativelayout(context context, attributeset attrs)
@override
public boolean dispatchtouchevent(motionevent ev)
return super.dispatchtouchevent(ev);
}//攔截
@override
public boolean onintercepttouchevent(motionevent ev)
return false;
}@override
public boolean ontouchevent(motionevent event)
return super.ontouchevent(event);
}}
package com.asce1885.viewdemo;
import android.content.context;
import android.util.attributeset;
import android.util.log;
import android.view.motionevent;
import android.widget.textview;
/** * created by guhaoxin on 16/3/28.
*/public class mytextview extends textview
public mytextview(context context, attributeset attrs)
@override
public boolean dispatchtouchevent(motionevent ev)
log.e(tag, string.valueof(super.dispatchtouchevent(ev)));
return super.dispatchtouchevent(ev);
}@override
public boolean ontouchevent(motionevent event)
return super.ontouchevent(event);
}}
我們可以得出如下結論:
(1)觸控事件的傳遞順序是由activity到viewgroup,再由viewgroup遞迴傳遞給它的子view;
(2)viewgroup通過onintercepttouchevent方法對事件進行攔截,如果該方法返回true,則事件不會向下傳遞,如果返回false或super.onintercepttouchevent,則事件會繼續傳遞子view。
(3)在子view對事件進行消費後,viewgroup將接收不到任何事件。
**中log.e(tag, string.valueof(super.dispatchtouchevent(ev)));列印出結果為true,事件停止
Android事件傳遞機制
android中的事件型別分為按鍵事件和螢幕觸控事件,touch事件是螢幕觸控事件的基礎事件,有必要對它進行深入的了解。乙個最簡單的螢幕觸控動作觸發了一系列touch事件 action down action move action move action move.action move acti...
Android事件傳遞機制
android開發過程中複雜混合控制項的難點之一的就是事件衝突。我們知道在處理事件衝突中,最重要的方法是 dispatchtouchevent onintercepttouchevent ontouchevent 通過作用這三個方法,我們可以達到事件的分發 攔截 消費的效果。在activity 無o...
Android事件傳遞機制
android中dispatchtouchevent,onintercepttouchevent,ontouchevent的理解 android中的事件型別分為按鍵事件和螢幕觸控事件,touch事件是螢幕觸控事件的基礎事件,有必要對它進行深入的了解。乙個最簡單的螢幕觸控動作觸發了一系列touch事件...