import
android.os.Bundle
import
androidx.activity.ComponentActivity
import
androidx.activity.compose.setContent
import
androidx.compose.animation.core.Transition
import
androidx.compose.animation.core.animateFloat
import
androidx.compose.animation.core.spring
import
androidx.compose.animation.core.updateTransition
import
androidx.compose.foundation.Image
import
androidx.compose.foundation.gestures.detectTapGestures
import
androidx.compose.foundation.layout.Box
import
androidx.compose.foundation.layout.Column
import
androidx.compose.foundation.layout.fillMaxSize
import
androidx.compose.material.MaterialTheme
import
androidx.compose.material.Surface
import
androidx.compose.runtime.*
import
androidx.compose.ui.Alignment
import
androidx.compose.ui.Modifier
import
androidx.compose.ui.graphics.graphicsLayer
import
androidx.compose.ui.input.pointer.pointerInput
import
androidx.compose.ui.res.painterResource
import
androidx.compose.ui.tooling.preview.Preview
import
com.shaun.bounceanimation.ui.theme.BounceAnimationTheme
class
MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super
.onCreate(savedInstanceState)
setContent {
BounceAnimationTheme {
Surface(color = MaterialTheme.colors.background) {
Bounce()
}
}
}
}
}
enum
class
BounceState { Pressed, Released }
@Preview
(showBackground =
true
)
@Composable
fun Bounce() {
var currentState: BounceState by remember { mutableStateOf(BounceState.Released) }
val transition = updateTransition(targetState = currentState, label =
"animation"
)
val scale: Float by transition.animateFloat(
transitionSpec = { spring(stiffness = 900f) }, label =
""
) { state ->
if
(state == BounceState.Pressed) {
0
.95f
}
else
{
1f
}
}
Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
Column(modifier = Modifier
.pointerInput(Unit) {
detectTapGestures(onPress = {
currentState = BounceState.Pressed
tryAwaitRelease()
currentState = BounceState.Released
})
}) {
Image(
painter = painterResource(id = R.drawable.gfg),
contentDescription =
"gfg"
,
modifier = Modifier.graphicsLayer {
scaleX = scale
scaleY = scale
})
}
}
}