Removing unnecessary object creation and double loop during
getDescendantCoordRelativeToAncestor
Change-Id: I034db2282a8aaf129336a425338c6a80d6a3a073
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 3511375..6bfce19 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -341,35 +341,27 @@
*/
public static float getDescendantCoordRelativeToAncestor(
View descendant, View ancestor, int[] coord, boolean includeRootScroll) {
- ArrayList<View> ancestorChain = new ArrayList<View>();
-
float[] pt = {coord[0], coord[1]};
-
+ float scale = 1.0f;
View v = descendant;
while(v != ancestor && v != null) {
- ancestorChain.add(v);
+ // For TextViews, scroll has a meaning which relates to the text position
+ // which is very strange... ignore the scroll.
+ if (v != descendant || includeRootScroll) {
+ pt[0] -= v.getScrollX();
+ pt[1] -= v.getScrollY();
+ }
+
+ v.getMatrix().mapPoints(pt);
+ pt[0] += v.getLeft();
+ pt[1] += v.getTop();
+ scale *= v.getScaleX();
+
v = (View) v.getParent();
}
- float scale = 1.0f;
- int count = ancestorChain.size();
- for (int i = 0; i < count; i++) {
- View v0 = ancestorChain.get(i);
- // For TextViews, scroll has a meaning which relates to the text position
- // which is very strange... ignore the scroll.
- if (v0 != descendant || includeRootScroll) {
- pt[0] -= v0.getScrollX();
- pt[1] -= v0.getScrollY();
- }
-
- v0.getMatrix().mapPoints(pt);
- pt[0] += v0.getLeft();
- pt[1] += v0.getTop();
- scale *= v0.getScaleX();
- }
-
- coord[0] = (int) Math.round(pt[0]);
- coord[1] = (int) Math.round(pt[1]);
+ coord[0] = Math.round(pt[0]);
+ coord[1] = Math.round(pt[1]);
return scale;
}