內外滑動方向一致。內外兩層同時能上下滑動,或同時能左右滑動。
前面兩種情況的巢狀。
如果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...