OSDN Git Service

Fix lockscreen wave animation artifacts
authorChet Haase <chet@google.com>
Wed, 2 Oct 2013 23:11:54 +0000 (16:11 -0700)
committerChet Haase <chet@google.com>
Thu, 3 Oct 2013 22:50:35 +0000 (15:50 -0700)
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

core/java/com/android/internal/widget/multiwaveview/GlowPadView.java
core/java/com/android/internal/widget/multiwaveview/PointCloud.java

index aad285a..cd1ccd3 100644 (file)
@@ -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;
index bbd1276..f299935 100644 (file)
@@ -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);
     }