Animação de feedback de toque como o Spotify no Jetpack Compose
May 04 2023
Crie um efeito de clique saltitante no Jetpack Compose
É essencial mostrar ao usuário feedback de clique bla bla bal, Resumindo, gosto mais do efeito de clique saltitante do Spotify do que do efeito Ripple padrão, então vamos fazer isso Ao longo do caminho, exploraremos alguns modificadores e animações também… Para fazer isso, vamos crie um Modificador reutilizável (semelhante ao modificador clicável) que diminui a escala e a opacidade quando o elemento da interface do usuário é pressionado. Vou colocar todo o código e depois explicá-lo… É isso, vamos usá-lo É isso, espero você amou o blog ❤️.

É essencial mostrar ao usuário o feedback do clique bla bla bal, Resumindo, gosto mais do efeito de clique saltitante do Spotify do que do efeito Ripple padrão, então vamos lá
Ao longo do caminho, vamos explorar alguns modificadores e animações também…

Para fazer isso, criaremos um reutilizável Modifier
(semelhante ao modificador clicável) que diminui a escala e a opacidade quando o elemento da interface do usuário é pressionado.
Eu irei em frente e colocarei todo o código e então explico…
/**
* 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
)
}
- Então, como temos várias animações que queremos executar quando
isPressed == true
, usamosupdateTransition()
isso nos fornece funções de extensão para executar várias animações. - Para criar as animações, usamos
animateFloat()
a extensão para criar duas animações, uma parascaleFactor
e outra paraopacity
a qual usaremos para animar nosso elemento de interface do usuário. - Para alterar a escala e o alfa, usamos
graphicsLayer
o Modifier, que geralmente é usado para aplicar transformações e animações a um elemento da interface do usuário. ( confira este ótimo artigo para saber mais ) - Por fim, adicionamos um modificador clicável para lidar com o clique e removemos o efeito cascata padrão definindo o parâmetro
indication
comonull
É isso, vamos usar
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
)
}
)
É isso, espero que tenham gostado do blog ❤️
Christopher Nolan uma vez se arrependeu de ter lido o 'roteiro de Pulp Fiction' de Quentin Tarantino