From c199701a97a65c0de15305d03c8519b1dde28f9b Mon Sep 17 00:00:00 2001 From: pubiqq Date: Mon, 10 Feb 2025 18:32:43 +0300 Subject: [PATCH] [FloatingActionButton] Fix labelOpacity property --- .../BaseMotionStrategy.java | 40 ++++++++----------- .../ExtendedFloatingActionButton.java | 10 +++++ 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/lib/java/com/google/android/material/floatingactionbutton/BaseMotionStrategy.java b/lib/java/com/google/android/material/floatingactionbutton/BaseMotionStrategy.java index c0489b590de..c92f2138062 100644 --- a/lib/java/com/google/android/material/floatingactionbutton/BaseMotionStrategy.java +++ b/lib/java/com/google/android/material/floatingactionbutton/BaseMotionStrategy.java @@ -30,6 +30,7 @@ import androidx.annotation.CallSuper; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.graphics.ColorUtils; import androidx.core.util.Preconditions; import com.google.android.material.animation.AnimatorSetCompat; import com.google.android.material.animation.MotionSpec; @@ -157,33 +158,13 @@ AnimatorSet createAnimator(@NonNull MotionSpec spec) { @Override public Float get(ExtendedFloatingActionButton object) { - // The alpha of the currently drawn text - int originalOpacity = - Color.alpha( - object.originalTextCsl.getColorForState( - object.getDrawableState(), fab.originalTextCsl.getDefaultColor())); - final float currentOpacity = Color.alpha(object.getCurrentTextColor()) / 255F; - return lerp(0F, 1F, currentOpacity / originalOpacity); + final int originalAlpha = Color.alpha(object.getCurrentOriginalTextColor()); + final int currentAlpha = Color.alpha(object.getCurrentTextColor()); + return originalAlpha != 0 ? (float) currentAlpha / originalAlpha : 0f; } @Override public void set(ExtendedFloatingActionButton object, Float value) { - // Since `value` is always between 0 (gone) and 1 (visible), interpolate between - // 0 (gone) and the color's original alpha to avoid overshooting the text alpha. - int originalColor = - object.originalTextCsl.getColorForState( - object.getDrawableState(), fab.originalTextCsl.getDefaultColor()); - - final float interpolatedValue = - lerp(0F, Color.alpha(originalColor) / 255F, value); - int alphaColor = - Color.argb( - (int) (interpolatedValue * 255), - Color.red(originalColor), - Color.green(originalColor), - Color.blue(originalColor)); - ColorStateList csl = ColorStateList.valueOf(alphaColor); - // Setting the text color back to the original CSL in an onAnimationEnd callback // causes the view to blink after the animation ends. To avoid this, reset the // text color on the last frame of this animation instead. @@ -193,8 +174,19 @@ public void set(ExtendedFloatingActionButton object, Float value) { // would jump in and jank the animation, but would conserve the user's updated // color. if (value == 1F) { // last frame and visible - object.silentlyUpdateTextColor(object.originalTextCsl); + object.silentlyUpdateTextColor(object.getOriginalTextColor()); } else { + final int originalColor = object.getCurrentOriginalTextColor(); + + // Since `value` is always between 0 (gone) and 1 (visible), interpolate + // between 0 (gone) and the color's original alpha to avoid overshooting + // the text alpha. + final int targetAlpha = + Math.round(lerp(0f, Color.alpha(originalColor), value)); + final int targetColor = + ColorUtils.setAlphaComponent(originalColor, targetAlpha); + + final ColorStateList csl = ColorStateList.valueOf(targetColor); object.silentlyUpdateTextColor(csl); } } diff --git a/lib/java/com/google/android/material/floatingactionbutton/ExtendedFloatingActionButton.java b/lib/java/com/google/android/material/floatingactionbutton/ExtendedFloatingActionButton.java index bfe9e5de906..4e9aecbac5a 100644 --- a/lib/java/com/google/android/material/floatingactionbutton/ExtendedFloatingActionButton.java +++ b/lib/java/com/google/android/material/floatingactionbutton/ExtendedFloatingActionButton.java @@ -43,6 +43,7 @@ import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.MarginLayoutParams; import androidx.annotation.AnimatorRes; +import androidx.annotation.ColorInt; import androidx.annotation.IntDef; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -460,6 +461,15 @@ private void saveOriginalTextCsl() { originalTextCsl = getTextColors(); } + ColorStateList getOriginalTextColor() { + return originalTextCsl; + } + + @ColorInt + int getCurrentOriginalTextColor() { + return originalTextCsl.getColorForState(getDrawableState(), 0); + } + /** * Update the text color without affecting the original, client-set color. */