Merge "Reduce RippleDrawable background opacity when no window focus"

This commit is contained in:
Louis Chang
2022-06-07 10:36:54 +00:00
committed by Android (Google) Code Review
2 changed files with 29 additions and 5 deletions

View File

@@ -1042,6 +1042,11 @@ package android.graphics.drawable {
method public android.graphics.Xfermode getXfermode();
}
public class RippleDrawable extends android.graphics.drawable.LayerDrawable {
method public float getTargetBackgroundOpacity();
method public void setBackgroundActive(boolean, boolean, boolean, boolean);
}
public class ShapeDrawable extends android.graphics.drawable.Drawable {
method public void setXfermode(@Nullable android.graphics.Xfermode);
}

View File

@@ -16,6 +16,8 @@
package android.graphics.drawable;
import android.annotation.TestApi;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.ElementType.METHOD;
@@ -321,6 +323,7 @@ public class RippleDrawable extends LayerDrawable {
boolean pressed = false;
boolean focused = false;
boolean hovered = false;
boolean windowFocused = false;
for (int state : stateSet) {
if (state == R.attr.state_enabled) {
@@ -331,10 +334,12 @@ public class RippleDrawable extends LayerDrawable {
pressed = true;
} else if (state == R.attr.state_hovered) {
hovered = true;
} else if (state == R.attr.state_window_focused) {
windowFocused = true;
}
}
setRippleActive(enabled && pressed);
setBackgroundActive(hovered, focused, pressed);
setBackgroundActive(hovered, focused, pressed, windowFocused);
return changed;
}
@@ -358,7 +363,10 @@ public class RippleDrawable extends LayerDrawable {
}
}
private void setBackgroundActive(boolean hovered, boolean focused, boolean pressed) {
/** @hide */
@TestApi
public void setBackgroundActive(boolean hovered, boolean focused, boolean pressed,
boolean windowFocused) {
if (mState.mRippleStyle == STYLE_SOLID) {
if (mBackground == null && (hovered || focused)) {
mBackground = new RippleBackground(this, mHotspotBounds, isBounded());
@@ -370,7 +378,7 @@ public class RippleDrawable extends LayerDrawable {
} else {
if (focused || hovered) {
if (!pressed) {
enterPatternedBackgroundAnimation(focused, hovered);
enterPatternedBackgroundAnimation(focused, hovered, windowFocused);
}
} else {
exitPatternedBackgroundAnimation();
@@ -840,9 +848,20 @@ public class RippleDrawable extends LayerDrawable {
invalidateSelf(false);
}
private void enterPatternedBackgroundAnimation(boolean focused, boolean hovered) {
/** @hide */
@TestApi
public float getTargetBackgroundOpacity() {
return mTargetBackgroundOpacity;
}
private void enterPatternedBackgroundAnimation(boolean focused, boolean hovered,
boolean windowFocused) {
mBackgroundOpacity = 0;
mTargetBackgroundOpacity = focused ? .6f : hovered ? .2f : 0f;
if (focused) {
mTargetBackgroundOpacity = windowFocused ? .6f : .2f;
} else {
mTargetBackgroundOpacity = hovered ? .2f : 0f;
}
if (mBackgroundAnimation != null) mBackgroundAnimation.cancel();
// after cancel
mRunBackgroundAnimation = true;