summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/Utilities.java
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2016-10-28 10:01:00 -0700
committerSunny Goyal <sunnygoyal@google.com>2016-10-28 10:24:40 -0700
commit5e0e94f0b2ae79770dd07b66441fda6e063e64ea (patch)
treeec25e783a544ef3bf46d041f6096696ceb63eb5f /src/com/android/launcher3/Utilities.java
parent37e4df17cb37b275cb6c36f00809d790d2c98a98 (diff)
downloadandroid_packages_apps_Trebuchet-5e0e94f0b2ae79770dd07b66441fda6e063e64ea.tar.gz
android_packages_apps_Trebuchet-5e0e94f0b2ae79770dd07b66441fda6e063e64ea.tar.bz2
android_packages_apps_Trebuchet-5e0e94f0b2ae79770dd07b66441fda6e063e64ea.zip
Simplifying mapCoordInSelfToDescendant
> Removing new object creation (during draw and touch handling) > Simplifying matrix operation to call invert only once at the end Change-Id: Iffadd6e9d84997baa36719ed688a7c3c1027e839
Diffstat (limited to 'src/com/android/launcher3/Utilities.java')
-rw-r--r--src/com/android/launcher3/Utilities.java66
1 files changed, 26 insertions, 40 deletions
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 95e3d8269..ec2dd0d57 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -60,7 +60,6 @@ import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.IOException;
import java.lang.reflect.Method;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Locale;
import java.util.Set;
@@ -83,6 +82,9 @@ public final class Utilities {
private static final int[] sLoc0 = new int[2];
private static final int[] sLoc1 = new int[2];
+ private static final float[] sPoint = new float[2];
+ private static final Matrix sMatrix = new Matrix();
+ private static final Matrix sInverseMatrix = new Matrix();
public static boolean isNycMR1OrAbove() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1;
@@ -163,68 +165,52 @@ public final class Utilities {
*/
public static float getDescendantCoordRelativeToAncestor(
View descendant, View ancestor, int[] coord, boolean includeRootScroll) {
- float[] pt = {coord[0], coord[1]};
+ sPoint[0] = coord[0];
+ sPoint[1] = coord[1];
+
float scale = 1.0f;
View v = descendant;
while(v != ancestor && v != null) {
// 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();
+ sPoint[0] -= v.getScrollX();
+ sPoint[1] -= v.getScrollY();
}
- v.getMatrix().mapPoints(pt);
- pt[0] += v.getLeft();
- pt[1] += v.getTop();
+ v.getMatrix().mapPoints(sPoint);
+ sPoint[0] += v.getLeft();
+ sPoint[1] += v.getTop();
scale *= v.getScaleX();
v = (View) v.getParent();
}
- coord[0] = Math.round(pt[0]);
- coord[1] = Math.round(pt[1]);
+ coord[0] = Math.round(sPoint[0]);
+ coord[1] = Math.round(sPoint[1]);
return scale;
}
/**
* Inverse of {@link #getDescendantCoordRelativeToAncestor(View, View, int[], boolean)}.
*/
- public static float mapCoordInSelfToDescendent(View descendant, View root,
- int[] coord) {
- ArrayList<View> ancestorChain = new ArrayList<View>();
-
- float[] pt = {coord[0], coord[1]};
-
+ public static void mapCoordInSelfToDescendant(View descendant, View root, int[] coord) {
+ sMatrix.reset();
View v = descendant;
while(v != root) {
- ancestorChain.add(v);
+ sMatrix.postTranslate(-v.getScrollX(), -v.getScrollY());
+ sMatrix.postConcat(v.getMatrix());
+ sMatrix.postTranslate(v.getLeft(), v.getTop());
v = (View) v.getParent();
}
- ancestorChain.add(root);
-
- float scale = 1.0f;
- Matrix inverse = new Matrix();
- int count = ancestorChain.size();
- for (int i = count - 1; i >= 0; i--) {
- View ancestor = ancestorChain.get(i);
- View next = i > 0 ? ancestorChain.get(i-1) : null;
-
- pt[0] += ancestor.getScrollX();
- pt[1] += ancestor.getScrollY();
-
- if (next != null) {
- pt[0] -= next.getLeft();
- pt[1] -= next.getTop();
- next.getMatrix().invert(inverse);
- inverse.mapPoints(pt);
- scale *= next.getScaleX();
- }
- }
-
- coord[0] = (int) Math.round(pt[0]);
- coord[1] = (int) Math.round(pt[1]);
- return scale;
+ sMatrix.postTranslate(-v.getScrollX(), -v.getScrollY());
+ sMatrix.invert(sInverseMatrix);
+
+ sPoint[0] = coord[0];
+ sPoint[1] = coord[1];
+ sInverseMatrix.mapPoints(sPoint);
+ coord[0] = Math.round(sPoint[0]);
+ coord[1] = Math.round(sPoint[1]);
}
/**