From 167a32326ea3a3b30c147cd02e3b3151e794e016 Mon Sep 17 00:00:00 2001 From: Chet Haase Date: Wed, 2 Oct 2013 16:11:54 -0700 Subject: [PATCH] Fix lockscreen wave animation artifacts On some display sizes, the wave animation was sometimes running more than once, starting over in the center and animating outward... partially. The problem was that the calculations determining the alpha value of the dots was returning bogus values when the display area was large enough, which is why the bug is only on some devices. This fix simplifies the math and ensures that the wave only animates once, from start to finish. Issue #11005936 regression on lockscreen animation for multi-wave widget Change-Id: Id21a2e4d2271f01c82c4bc6e1f37d78e68b9b6e4 --- .../internal/widget/multiwaveview/GlowPadView.java | 2 +- .../internal/widget/multiwaveview/PointCloud.java | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java b/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java index aad285ac2f8e4..cd1ccd3bb9eb4 100644 --- a/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java +++ b/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java @@ -76,7 +76,7 @@ public class GlowPadView extends View { } // Tuneable parameters for animation - private static final int WAVE_ANIMATION_DURATION = 1350; + private static final int WAVE_ANIMATION_DURATION = 1000; private static final int RETURN_TO_HOME_DELAY = 1200; private static final int RETURN_TO_HOME_DURATION = 200; private static final int HIDE_ANIMATION_DELAY = 200; diff --git a/core/java/com/android/internal/widget/multiwaveview/PointCloud.java b/core/java/com/android/internal/widget/multiwaveview/PointCloud.java index bbd1276be6fec..f2999354cada9 100644 --- a/core/java/com/android/internal/widget/multiwaveview/PointCloud.java +++ b/core/java/com/android/internal/widget/multiwaveview/PointCloud.java @@ -45,8 +45,8 @@ public class PointCloud { public class WaveManager { private float radius = 50; - private float width = 200.0f; // TODO: Make configurable private float alpha = 0.0f; + public void setRadius(float r) { radius = r; } @@ -186,13 +186,12 @@ public class PointCloud { // Compute contribution from Wave float radius = hypot(point.x, point.y); - float distanceToWaveRing = (radius - waveManager.radius); float waveAlpha = 0.0f; - if (distanceToWaveRing < waveManager.width * 0.5f && distanceToWaveRing < 0.0f) { - float cosf = FloatMath.cos(PI * 0.25f * distanceToWaveRing / waveManager.width); - waveAlpha = waveManager.alpha * max(0.0f, (float) Math.pow(cosf, 20.0f)); + if (radius < waveManager.radius * 2) { + float distanceToWaveRing = (radius - waveManager.radius); + float cosf = FloatMath.cos(PI * 0.5f * distanceToWaveRing / waveManager.radius); + waveAlpha = waveManager.alpha * max(0.0f, (float) Math.pow(cosf, 6.0f)); } - return (int) (max(glowAlpha, waveAlpha) * 255); }