W tej dokumentacji znajdziesz przykłady użycia stylów do tworzenia określonych rodzajów komponentów.
Przyciski
Style można wykorzystać do tworzenia wielu różnych rodzajów przycisków, które mogą różnić się od standardowych komponentów Material.
Przycisk podstawowy
Oto przycisk zdefiniowany jako podstawa dla różnych typów przycisków:
@Composable fun BaseButton( onClick: () -> Unit, modifier: Modifier = Modifier, style: Style = Style, enabled: Boolean = true, interactionSource: MutableInteractionSource? = remember { MutableInteractionSource() }, content: @Composable RowScope.() -> Unit ) { val styleState = rememberUpdatedStyleState(interactionSource) { it.isEnabled = enabled } Row( modifier = modifier .semantics(properties = { role = Role.Button }) .clickable( enabled = enabled, onClick = onClick, interactionSource = interactionSource, indication = null, ) .styleable(styleState, baseButtonStyle, style), content = content, verticalAlignment = Alignment.CenterVertically ) }
Przycisk z tłem, które przesuwa się po najechaniu kursorem
Aby zdefiniować przycisk z tłem, które przesuwa się po najechaniu kursorem, użyj tego kodu:
@Preview @Composable fun HoverButtonExample() { Box( modifier = Modifier.padding(32.dp), contentAlignment = Alignment.Center ) { BaseButton( onClick = {}, style = Style { background(Color.Transparent) shape(RoundedCornerShape(0.dp)) border(1.dp, Color.Black) contentColor(Color.Black) fontSize(16.sp) fontWeight(FontWeight.Light) letterSpacing(1.sp) contentPadding(vertical = 13.dp, horizontal = 20.dp) dropShadow( Shadow( spread = 0.dp, color = Color(0xFFFFE54C), radius = 0.dp, offset = DpOffset(7.dp, 7.dp) ) ) hovered { animate(tween(200)) { dropShadow( Shadow( spread = 0.dp, color = Color(0xFFFFE54C), radius = 0.dp, offset = DpOffset(0.dp, 0.dp) ) ) } } pressed { animate(tween(200)) { dropShadow( Shadow( spread = 0.dp, color = Color(0xFFFFE54C), radius = 0.dp, offset = DpOffset(0.dp, 0.dp) ) ) } } } ) { BaseText("Button 52") } } }
Przycisk z zaokrąglonymi rogami i efektem głębi oraz animacją cienia
Aby utworzyć przycisk z efektem głębi, który przesuwa cień w górę i w dół po naciśnięciu (pressed), możesz to zrobić w ten sposób:
@Preview @Composable fun ShadowAnimationButton() { Box(modifier = Modifier.padding(32.dp)) { val density = LocalDensity.current val buttonStyle = Style { background(Color(0xFFFBEED0)) border(2.dp, Color(0xFF422800)) shape(RoundedCornerShape(30.dp)) dropShadow( Shadow( color = Color(0xFF422800), offset = DpOffset(4.dp, 4.dp), radius = 0.dp, spread = 0.dp ) ) contentColor(Color(0xFF422800)) fontWeight(FontWeight.SemiBold) fontSize(18.sp) contentPaddingHorizontal(25.dp) externalPadding(8.dp) height(50.dp) textAlign(TextAlign.Center) hovered { animate { background(Color.White) } } pressed { animate { dropShadow( Shadow( color = Color(0xFF422800), offset = DpOffset(2.dp, 2.dp), radius = 0.dp, spread = 0.dp ) ) translation(with(density) { 2.dp.toPx() }, with(density) { 2.dp.toPx() }) } } } BaseButton( onClick = {}, style = buttonStyle ) { BaseText("Button 74") } } }
Style z wieloma warstwami i animacją po naciśnięciu
Ten kod tworzy przycisk z efektem głębi po naciśnięciu, który ma wiele warstw stylów i używa tego samego elementu StyleState:
@Preview @Composable fun MultipleStylesButton() { val interactionSource = remember { MutableInteractionSource() } val styleState = remember(interactionSource) { MutableStyleState(interactionSource) } val density = LocalDensity.current Box( modifier = Modifier .styleable(styleState) { size(200.dp, 48.dp) externalPadding(32.dp) } .clickable(interactionSource, indication = null) {}, contentAlignment = Alignment.Center ) { val edgeStyle = Style { fillSize() shape(RoundedCornerShape(16.dp)) background(Color(0xFF1CB0F6)) } val frontStyle = Style { fillSize() background(Color(0xFF1899D6)) shape(RoundedCornerShape(16.dp)) contentPadding(vertical = 12.dp, horizontal = 16.dp) translationY(with(density) { (-4).dp.toPx() }) pressed { animate { translationY(with(density) { (0).dp.toPx() }) } } } Box(modifier = Modifier.semantics(properties = { role = Role.Button }).styleable(styleState, edgeStyle)) { Box( modifier = Modifier .styleable(styleState, frontStyle), contentAlignment = Alignment.Center ) { BaseText( "Button 19".toUpperCase(Locale.current), style = Style { contentColor(Color.White) fontSize(15.sp) fontWeight(FontWeight.Bold) letterSpacing(0.8.sp) } ) } } } }