Android的事件傳遞機制

2021-08-01 09:59:51 字數 2782 閱讀 4173

今天,看了顧浩鑫的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事件...