in litho-widget/src/main/java/com/facebook/litho/widget/CardSpec.java [94:218]
static Component onCreateLayout(
ComponentContext c,
@Prop Component content,
@Prop(optional = true) @Nullable String cardBackgroundTransitionKey,
@Prop(optional = true, resType = ResType.COLOR) int cardBackgroundColor,
@Prop(optional = true) @Nullable DynamicValue<Integer> cardBackgroundColorDv,
@Prop(optional = true, resType = ResType.COLOR) int clippingColor,
@Prop(optional = true, resType = ResType.COLOR) int shadowStartColor,
@Prop(optional = true, resType = ResType.COLOR) int shadowEndColor,
@Prop(optional = true, resType = ResType.DIMEN_OFFSET) float cornerRadius,
@Prop(optional = true, resType = ResType.DIMEN_OFFSET) float elevation,
@Prop(optional = true, resType = ResType.DIMEN_OFFSET) int shadowTopOverride,
@Prop(optional = true, resType = ResType.DIMEN_OFFSET) int shadowBottomOverride,
@Prop(optional = true, resType = ResType.DIMEN_OFFSET) float shadowLeftOverride,
@Prop(optional = true, resType = ResType.DIMEN_OFFSET) float shadowRightOverride,
@Prop(
optional = true,
docString =
"[UNPERFORMANT WARNING] if you do not need to render your corners transparently please set to false. It is more expensive to perform rounded corners with transparent\n"
+ "clipping due to antialiasing operations.\n\n"
+ "<p>A component that renders a given component into a card border with shadow, and allows for\n"
+ "transparent corners. With transparencyEnabled(false) {@link * com.facebook.litho.widget.Card} uses imitation clipped corners that\n"
+ "draw in a solid color to mimic the background. transparencyEnabled(true) is useful if you are\n"
+ "rendering your pill over a gradient or dynamic background.\n")
boolean transparencyEnabled,
@Prop(optional = true) boolean disableClipTopLeft,
@Prop(optional = true) boolean disableClipTopRight,
@Prop(optional = true) boolean disableClipBottomLeft,
@Prop(optional = true) boolean disableClipBottomRight) {
final Resources resources = c.getResources();
if (cornerRadius == -1) {
cornerRadius = pixels(resources, DEFAULT_CORNER_RADIUS_DP);
}
if (elevation == -1) {
elevation = pixels(resources, DEFAULT_SHADOW_SIZE_DP);
}
final int shadowTop = shadowTopOverride == -1 ? getShadowTop(elevation) : shadowTopOverride;
final int shadowBottom =
shadowBottomOverride == -1 ? getShadowBottom(elevation) : shadowBottomOverride;
final int shadowLeft =
shadowLeftOverride == CardShadowDrawable.UNDEFINED
? getShadowLeft(elevation)
: (int) Math.ceil(shadowLeftOverride);
final int shadowRight =
shadowRightOverride == CardShadowDrawable.UNDEFINED
? getShadowRight(elevation)
: (int) Math.ceil(shadowRightOverride);
Column.Builder columnBuilder =
Column.create(c)
.marginPx(LEFT, shadowLeft)
.marginPx(RIGHT, shadowRight)
.marginPx(TOP, disableClipTopLeft && disableClipTopRight ? 0 : shadowTop)
.marginPx(BOTTOM, disableClipBottomLeft && disableClipBottomRight ? 0 : shadowBottom);
if (transparencyEnabled) {
final int realClippingColor =
clippingColor == UNSET_CLIPPING ? Color.TRANSPARENT : clippingColor;
columnBuilder =
columnBuilder
.backgroundColor(realClippingColor)
.child(
makeTransparencyEnabledCardClip(
c,
cardBackgroundColor,
cardBackgroundColorDv,
realClippingColor,
cornerRadius,
disableClipTopLeft,
disableClipTopRight,
disableClipBottomLeft,
disableClipBottomRight,
cardBackgroundTransitionKey))
.child(content);
} else {
final int realClippingColor = clippingColor == UNSET_CLIPPING ? Color.WHITE : clippingColor;
columnBuilder =
columnBuilder
.child(
Column.create(c)
.backgroundColor(cardBackgroundColor)
.flexGrow(1)
.flexShrink(0)
.positionType(ABSOLUTE)
.positionPx(ALL, 0)
.transitionKey(cardBackgroundTransitionKey)
.transitionKeyType(Transition.TransitionKeyType.GLOBAL)
.build())
.child(content)
.child(
makeCardClip(
c,
realClippingColor,
cornerRadius,
disableClipTopLeft,
disableClipTopRight,
disableClipBottomLeft,
disableClipBottomRight));
}
Component.Builder shadow = null;
if (elevation > 0) {
CardShadow.Builder cardShadowBuilder =
CardShadow.create(c)
.shadowStartColor(shadowStartColor)
.shadowEndColor(shadowEndColor)
.cornerRadiusPx(cornerRadius)
.shadowSizePx(elevation)
.hideTopShadow(disableClipTopLeft && disableClipTopRight)
.hideBottomShadow(disableClipBottomLeft && disableClipBottomRight)
.positionType(ABSOLUTE)
.positionPx(ALL, 0)
.shadowLeftSizeOverridePx(shadowLeftOverride)
.shadowRightSizeOverridePx(shadowRightOverride);
shadow = cardShadowBuilder;
}
return Column.create(c).child(columnBuilder).child(shadow).build();
}