From 575ffb856ec7a91701a79840cad315102eaa0afd Mon Sep 17 00:00:00 2001 From: George Mount Date: Wed, 7 Feb 2018 12:38:47 -0800 Subject: [PATCH] Fix bug in calculating path in ArcMotion Bug: 73077523 When the path is perfectly horizontal, ArcMotion was calculating a Path that had NaN values. This corrects that problem by special casing horizontal and vertical paths. Test: manual with app that discovered the problem Test: manual with test app Test: I30d51206194e3c68ea145d3a81e05a461c4e0ca8 Change-Id: Ic1a70b79290847726fc7994d1224fd77024e0610 --- core/java/android/transition/ArcMotion.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/java/android/transition/ArcMotion.java b/core/java/android/transition/ArcMotion.java index da1483499220f..172c8376c8cca 100644 --- a/core/java/android/transition/ArcMotion.java +++ b/core/java/android/transition/ArcMotion.java @@ -216,7 +216,13 @@ public class ArcMotion extends PathMotion { boolean isMovingUpwards = startY > endY; - if ((Math.abs(deltaX) < Math.abs(deltaY))) { + if (deltaY == 0) { + ex = dx; + ey = dy + (Math.abs(deltaX) * 0.5f * mMinimumHorizontalTangent); + } else if (deltaX == 0) { + ex = dx + (Math.abs(deltaY) * 0.5f * mMinimumVerticalTangent); + ey = dy; + } else if ((Math.abs(deltaX) < Math.abs(deltaY))) { // Similar triangles bfa and bde mean that (ab/fb = eb/bd) // Therefore, eb = ab * bd / fb // ab = hypotenuse @@ -254,7 +260,7 @@ public class ArcMotion extends PathMotion { float maximumArcDist2 = midDist2 * mMaximumTangent * mMaximumTangent; float newArcDistance2 = 0; - if (arcDist2 < minimumArcDist2) { + if (arcDist2 != 0 && arcDist2 < minimumArcDist2) { newArcDistance2 = minimumArcDist2; } else if (arcDist2 > maximumArcDist2) { newArcDistance2 = maximumArcDist2;