android事件衝突解決之終極方案

2021-07-31 10:22:01 字數 2036 閱讀 3503

android的兩大基礎控制項型別:view和viewgroup。

view即普通的控制項,沒有子布局的,如button、textview. viewgroup繼承自view,表示可以有子控制項,如linearlayout、listview這些。而事件即motionevent,最重要的有3個:

(1)motionevent.action_down 按下view,是所有事件的開始

(2)motionevent.action_move 滑動事件

(3)motionevent.action_up 與down對應,表示抬起

事件傳遞機制

1、事件入口是dispatchtouchevent(),它會先執行註冊的ontouch監聽,如果一切順利的話,接著執行ontouchevent,在ontouchevent裡會執行onclick監聽。

2、無論是dispatchtouchevent還是ontouchevent,如果返回true表示這個事件已經被消費、處理了,不再往下傳了。在dispathtouchevent的原始碼裡可以看到,如果ontouchevent返回了true,那麼它也返回true。如果dispatch***在執行ontouch監聽的時候,ontouch返回了true,那麼它也返回true,這個事件提前被ontouch消費掉了。就不再執行ontouchevent了,更別說onclick監聽了。

3、我們通常在ontouch監聽了設定一旦被觸控就改變它的背景、透明度之類的,這個ontouch表示事件的時機。而在onclick監聽了去具體幹某些事。

由於我們使用控制項時進行了巢狀,導致子控制項的事件被父控制項攔截了並不再分發而導致的,常見於,listview中的button,巢狀的viewpager或是其他組合。

我們可以使用乙個類繼承,然後重寫一些時間分發的方法,某些時候讓父控制項不攔截事件,某些時候使父控制項攔截事件。

當我們的viewpager與內嵌的viewpager衝突時,我們可以使用乙個類繼承viewpager,然後重寫一些時間分發的方法,某些時候讓父控制項不攔截事件,某些時候使父控制項攔截事件。上**:

/**

* created by administrator on 2017/4/28.

* 水平方向滑動,解決事件衝突

*/public

class

horizontalscrollviewpager

extends

viewpager

public

horizontalscrollviewpager(context context, attributeset attrs)

/*** 起始座標

*/private

float startx;

private

float starty;

@override

public

boolean

dispatchtouchevent(motionevent ev)

// 2.2,當滑動到viewpager的最後乙個頁面,並且是從右到左滑動

// getparent().requestdisallowintercepttouchevent(false);

else

if((getcurrentitem()==(getadapter().getcount()-1))&& distancex <0)

// 2.3,其他,中間部分

// getparent().requestdisallowintercepttouchevent(true);

else

}else

break;

case motionevent.action_up:

break;

default:

break;

}return

super.dispatchtouchevent(ev);

}}

Android滑動衝突解決方法

dispatchtouchevent ev 偽 public boolean dispatchtouchevent motionevent ev else return consume 1.外部攔截法 重寫父view的oninterceptouchevent override public bool...

Android 滑動衝突的解決方式

外部解決滑動衝突的方式就是當我們viewgrop分發事件的時候判斷是否攔截,因為事件的分發機制就是從外向內分發,那麼我們在viewgrop分發的時候就判斷是否需要攔截就可以解決滑動衝突。內部解決滑動衝突的方式是首先讓父view不攔截事件,然後在子view中判斷是父view攔截呢還是子view攔截呢。...

小程式行內點選事件衝突解決

說明 比如這種情況下,比如tr上有乙個點選事件,第乙個cell下也有點選事件,但是點選cell時會觸發到tr的事件 view class tr bindtap parentclick view class cell bindtap childclick 1 view view class cell ...