summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--graphics/java/android/graphics/drawable/RippleAnimationSession.java14
-rw-r--r--graphics/java/android/graphics/drawable/RippleDrawable.java2
-rw-r--r--graphics/java/android/graphics/drawable/RippleShader.java13
3 files changed, 11 insertions, 18 deletions
diff --git a/graphics/java/android/graphics/drawable/RippleAnimationSession.java b/graphics/java/android/graphics/drawable/RippleAnimationSession.java
index 877d07f0d928..b57f7af14a0e 100644
--- a/graphics/java/android/graphics/drawable/RippleAnimationSession.java
+++ b/graphics/java/android/graphics/drawable/RippleAnimationSession.java
@@ -50,7 +50,6 @@ public final class RippleAnimationSession {
private long mStartTime;
private boolean mForceSoftware;
private final ValueAnimator mSparkle = ValueAnimator.ofFloat(0, 1);
- private final ArraySet<Animator> mActiveAnimations = new ArraySet<>(3);
RippleAnimationSession(@NonNull AnimationProperties<Float, Paint> properties,
boolean forceSoftware) {
@@ -60,12 +59,11 @@ public final class RippleAnimationSession {
mSparkle.addUpdateListener(anim -> {
final long now = AnimationUtils.currentAnimationTimeMillis();
final long elapsed = now - mStartTime - ENTER_ANIM_DURATION;
- final float phase = (float) elapsed / 1000f;
- mProperties.getShader().setSecondsOffset(phase);
+ final float phase = (float) elapsed / 30000f;
+ mProperties.getShader().setNoisePhase(phase);
notifyUpdate();
});
mSparkle.setDuration(ENTER_ANIM_DURATION);
- mSparkle.setStartDelay(ENTER_ANIM_DURATION);
mSparkle.setInterpolator(LINEAR_INTERPOLATOR);
mSparkle.setRepeatCount(ValueAnimator.INFINITE);
}
@@ -81,7 +79,6 @@ public final class RippleAnimationSession {
}
@NonNull RippleAnimationSession exit(Canvas canvas) {
- mSparkle.end();
if (isHwAccelerated(canvas)) exitHardware((RecordingCanvas) canvas);
else exitSoftware();
return this;
@@ -89,7 +86,6 @@ public final class RippleAnimationSession {
private void onAnimationEnd(Animator anim) {
notifyUpdate();
- mActiveAnimations.remove(anim);
}
@NonNull RippleAnimationSession setOnSessionEnd(
@@ -119,13 +115,13 @@ public final class RippleAnimationSession {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
+ mSparkle.end();
Consumer<RippleAnimationSession> onEnd = mOnSessionEnd;
if (onEnd != null) onEnd.accept(RippleAnimationSession.this);
}
});
expand.setInterpolator(LINEAR_INTERPOLATOR);
expand.start();
- mActiveAnimations.add(expand);
}
private long computeDelay() {
@@ -153,6 +149,7 @@ public final class RippleAnimationSession {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
+ mSparkle.end();
Consumer<RippleAnimationSession> onEnd = mOnSessionEnd;
if (onEnd != null) onEnd.accept(RippleAnimationSession.this);
}
@@ -163,7 +160,6 @@ public final class RippleAnimationSession {
long delay = computeDelay();
exit.setStartDelay(delay);
exit.start();
- mActiveAnimations.add(exit);
}
private void enterHardware(RecordingCanvas canvas) {
@@ -182,9 +178,7 @@ public final class RippleAnimationSession {
expand.start();
if (!mSparkle.isRunning()) {
mSparkle.start();
- mActiveAnimations.add(mSparkle);
}
- mActiveAnimations.add(expand);
}
private void enterSoftware() {
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index c6d996234fb3..fb2b9b343f0a 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -915,7 +915,7 @@ public class RippleDrawable extends LayerDrawable {
shader.setOrigin(w / 2, y / 2);
shader.setTouch(x, y);
shader.setResolution(w, h);
- shader.setSecondsOffset(0);
+ shader.setNoisePhase(0);
shader.setRadius(radius);
shader.setProgress(.0f);
properties = new RippleAnimationSession.AnimationProperties<>(
diff --git a/graphics/java/android/graphics/drawable/RippleShader.java b/graphics/java/android/graphics/drawable/RippleShader.java
index 8eddbea4d1f8..ea9ba325a826 100644
--- a/graphics/java/android/graphics/drawable/RippleShader.java
+++ b/graphics/java/android/graphics/drawable/RippleShader.java
@@ -28,7 +28,7 @@ final class RippleShader extends RuntimeShader {
+ "uniform float in_maxRadius;\n"
+ "uniform vec2 in_resolution;\n"
+ "uniform float in_hasMask;\n"
- + "uniform float in_secondsOffset;\n"
+ + "uniform float in_noisePhase;\n"
+ "uniform vec4 in_color;\n"
+ "uniform shader in_shader;\n";
private static final String SHADER_LIB =
@@ -49,7 +49,7 @@ final class RippleShader extends RuntimeShader {
+ " float s = 0.0;\n"
+ " for (float i = 0; i < 4; i += 1) {\n"
+ " float l = i * 0.25;\n"
- + " float h = l + 0.025;\n"
+ + " float h = l + 0.005;\n"
+ " float o = abs(sin(0.1 * PI * (t + i)));\n"
+ " s += threshold(n + o, l, h);\n"
+ " }\n"
@@ -83,9 +83,8 @@ final class RippleShader extends RuntimeShader {
+ " vec2 center = mix(in_touch, in_origin, fadeIn);\n"
+ " float ring = getRingMask(p, center, in_maxRadius, fadeIn);\n"
+ " float alpha = min(fadeIn, 1. - fadeOutNoise);\n"
- + " float sparkle = sparkles(p, in_progress * 0.25 + in_secondsOffset)\n"
- + " * ring * alpha;\n"
- + " float fade = min(fadeIn, 1.-fadeOutRipple);\n"
+ + " float sparkle = sparkles(p, in_noisePhase) * ring * alpha;\n"
+ + " float fade = min(fadeIn, 1. - fadeOutRipple);\n"
+ " vec4 circle = in_color * (softCircle(p, center, in_maxRadius "
+ " * fadeIn, 0.2) * fade);\n"
+ " float mask = in_hasMask == 1. ? sample(in_shader).a > 0. ? 1. : 0. : 1.;\n"
@@ -111,8 +110,8 @@ final class RippleShader extends RuntimeShader {
/**
* Continuous offset used as noise phase.
*/
- public void setSecondsOffset(float t) {
- setUniform("in_secondsOffset", t);
+ public void setNoisePhase(float t) {
+ setUniform("in_noisePhase", t);
}
public void setOrigin(float x, float y) {