From a6478a3a130c3680bc6d8fa6490ac805fa15bdd2 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Fri, 17 Aug 2012 16:40:00 -0700 Subject: [PATCH] Respect child drawing order when dispatching touch events Make sure that touch events are always dispatched to the "topmost" view when views overlap. Bug 6996501 Change-Id: I4df25dd7531c4b268c8377c0bf0945ab862733b9 --- core/java/android/view/ViewGroup.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 1548743364a02..81902ac949e58 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -1715,8 +1715,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final float x = event.getX(); final float y = event.getY(); + final boolean customOrder = isChildrenDrawingOrderEnabled(); for (int i = childrenCount - 1; i >= 0; i--) { - final View child = children[i]; + final int childIndex = customOrder ? getChildDrawingOrder(childrenCount, i) : i; + final View child = children[childIndex]; if (!canViewReceivePointerEvents(child) || !isTransformedTouchPointInView(x, y, child, null)) { continue; @@ -1841,8 +1843,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final float x = ev.getX(actionIndex); final float y = ev.getY(actionIndex); + final boolean customOrder = isChildrenDrawingOrderEnabled(); for (int i = childrenCount - 1; i >= 0; i--) { - final View child = children[i]; + final int childIndex = customOrder ? + getChildDrawingOrder(childrenCount, i) : i; + final View child = children[childIndex]; if (!canViewReceivePointerEvents(child) || !isTransformedTouchPointInView(x, y, child, null)) { continue; @@ -1860,7 +1865,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) { // Child wants to receive touch within its bounds. mLastTouchDownTime = ev.getDownTime(); - mLastTouchDownIndex = i; + mLastTouchDownIndex = childIndex; mLastTouchDownX = ev.getX(); mLastTouchDownY = ev.getY(); newTouchTarget = addTouchTarget(child, idBitsToAssign);