Touch Feedback Animation, jak Spotify w Jetpack Compose
May 04 2023
Zbuduj efekt odbijającego się kliknięcia w Jetpack Compose
Istotne jest, aby pokazać użytkownikowi informację zwrotną o kliknięciu bla bla bal, Krótko mówiąc, efekt odbijającego się kliknięcia w Spotify podoba mi się bardziej niż domyślny efekt falowania, więc zróbmy to Po drodze zbadamy też kilka modyfikatorów i animacji… Aby to zrobić, będziemy utwórz modyfikator wielokrotnego użytku (podobny do modyfikatora klikalnego), który zmniejsza skalę i krycie po naciśnięciu elementu interfejsu użytkownika. Wstawię cały kod, a następnie wyjaśnię… To wszystko, użyjmy tego Mam nadzieję, że to wszystko pokochałaś bloga ❤️.
Istotne jest, aby pokazać użytkownikowi informację zwrotną o kliknięciu bla bla bal, Krótko mówiąc, efekt odbijającego się kliknięcia w Spotify podoba mi się bardziej niż domyślny efekt Ripple, więc zróbmy to
Po drodze przyjrzymy się też niektórym modyfikatorom i animacji…
Aby to zrobić, stworzymy wielokrotnego użytku Modifier(podobnie jak klikalny modyfikator), który zmniejsza skalę i krycie po naciśnięciu elementu interfejsu użytkownika.
Pójdę dalej i umieszczę cały kod, a następnie wyjaśnię…
/**
* Adds a bouncing click effect to a Composable.
*
* @param enabled whether the UI element should be enabled and clickable
* @param onClick the action to perform when the UI element is clicked
*/
fun Modifier.bouncingClickable(
enabled: Boolean = true,
onClick: () -> Unit
) = composed {
val interactionSource = remember { MutableInteractionSource() }
val isPressed by interactionSource.collectIsPressedAsState()
val animationTransition = updateTransition(isPressed, label = "BouncingClickableTransition")
val scaleFactor by animationTransition.animateFloat(
targetValueByState = { pressed -> if (pressed) 0.94f else 1f },
label = "BouncingClickableScaleFactorTransition",
)
val opacity by animationTransition.animateFloat(
targetValueByState = { pressed -> if (pressed) 0.7f else 1f },
label = "BouncingClickableOpacityTransition"
)
this
.graphicsLayer {
this.scaleX = scaleFactor
this.scaleY = scaleFactor
this.alpha = opacity
}
.clickable(
interactionSource = interactionSource,
indication = null,
enabled = enabled,
onClick = onClick
)
}
- Następnie, ponieważ mamy wiele animacji, które chcemy uruchomić, gdy
isPressed == true, używamyupdateTransition()tego, co zapewnia nam funkcje rozszerzające do uruchamiania wielu animacji. - Aby utworzyć animacje, używamy
animateFloat()rozszerzenia do utworzenia dwóch animacji, jednej dlascaleFactori jednejopacity, której użyjemy do animowania naszego elementu interfejsu użytkownika. - Aby zmienić skalę i alfa, użyliśmy
graphicsLayermodyfikatora, który jest zwykle używany do stosowania transformacji i animacji elementu interfejsu użytkownika. ( sprawdź ten wspaniały artykuł, aby dowiedzieć się więcej ) - Na koniec dodajemy klikalny modyfikator do obsługi kliknięć i usuwamy domyślny efekt falowania, ustawiając
indicationparametr nanull
To tyle, korzystajmy
Box(
modifier = Modifier
.bouncingClickable {
println("Clicked...")
}
.size(100.dp)
.clip(CircleShape)
.background(Color.Black)
) {}
val scaleFactor by animationTransition.animateFloat(
targetValueByState = { pressed -> if (pressed) 0.94f else 1f },
label = "BouncingClickableScaleFactorTransition",
transitionSpec = {
spring(
dampingRatio = Spring.DampingRatioMediumBouncy,
stiffness = Spring.StiffnessLow
)
}
)
To tyle, mam nadzieję, że blog wam się spodobał ❤️

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































