View的事件體系三 滑動衝突處理

2021-08-19 14:31:37 字數 979 閱讀 7680

內外滑動方向一致。內外兩層同時能上下滑動,或同時能左右滑動。

前面兩種情況的巢狀。

如果abs(x) < abs(y), 認定為上下滑動

x 或 y為正,則滑動方向為右或下

x 或 y為負,則滑動方向為左或上

針對場景2的情況,無法根據滑動向量或速度向量來做判斷。此時只能通過介面內容所呈現的業務來做判斷:

比場景2更複雜,也只能從業務上尋找判斷的點。

內部攔截法:首先由子view來處理事件,如果父容器需要處理事件,才會將後續事件交由父容器處理;否則,後續事件將繼續由子view來處理。

下面是處理流程:

父容器絕不攔截down事件,根據是否需要處理事件,可能會攔截move和up。這是為了保證首先由子元素來處理事件。

子元素在分發down時,立即請求父容器禁止攔截事件: 

getparent().requestdisallowintercepttouchevent(true);

這是為了確保後續事件依然由子容器處理,所以請求父容器禁止攔截事件。

子元素在分發move時,如果父容器需要處理事件,則請求父容器允許攔截後續事件(move和up)。

如果父容器不需要處理事件,那麼父容器將繼續保持禁止攔截事件的狀態。此時所有的事件都將由子元素來處理。

重寫父容器的onintercepttouchevent,保證父容器永不攔截down,並一直攔截move和up:

@override

public boolean onintercepttouchevent(motionevent event)

return

true;

}

顯然,如果子元素不請求父容器禁止攔截事件:getparent().requestdisallowintercepttouchevent(false),父容器將一直會攔截move和up。

ViewPager子View滑動事件衝突解決

事件分發 public boolean dispatchtouchevent motionevent ev android事件以隧道方式逐層向下傳遞。事件首先由dispatchtouchevent方法分發,分發邏輯如下 return true 由該dispatchtouchevent方法消費並且停止...

ViewPager子View滑動事件衝突解決

事件分發 public boolean dispatchtouchevent motionevent ev android事件以隧道方式逐層向下傳遞。事件首先由dispatchtouchevent方法分發,分發邏輯如下 return true 由該dispatchtouchevent方法消費並且停止...

View的滑動衝突

外部滑動方向和內部滑動方向一致 上面兩種情況的巢狀 父容器決定事件是否攔截 偽 public boolean onintercepthoverevent motionevent event else break case motionevent.action up 必須返回false,因為actio...