use spring in Animations

This commit is contained in:
BinTianqi
2024-03-08 15:24:04 +08:00
parent f179aaf637
commit 6da2b2efbc
2 changed files with 18 additions and 18 deletions

View File

@@ -16,7 +16,6 @@ import androidx.activity.compose.setContent
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape

View File

@@ -2,54 +2,55 @@ package com.binbin.androidowner.ui.theme
import android.content.Context
import androidx.compose.animation.*
import androidx.compose.animation.core.*
import androidx.compose.animation.core.FiniteAnimationSpec
import androidx.compose.animation.core.Spring
import androidx.compose.animation.core.VisibilityThreshold
import androidx.compose.animation.core.spring
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
import androidx.navigation.NavBackStackEntry
class Animations(myContext: Context){
private val springFade = tween<Float>(durationMillis = 150)
private val springSlide:SpringSpec<IntOffset> = SpringSpec(Spring.DampingRatioNoBouncy, Spring.StiffnessMediumLow, null)
private val fade: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow)
private val spring:FiniteAnimationSpec<IntOffset> = spring(stiffness = Spring.StiffnessMediumLow, visibilityThreshold = IntOffset.VisibilityThreshold)
private val navIconSpringSlide:SpringSpec<IntSize> = SpringSpec(Spring.DampingRatioNoBouncy, Spring.StiffnessMediumLow, null)
val navIconEnterTransition:EnterTransition = expandHorizontally(navIconSpringSlide) + fadeIn()
val navIconExitTransition:ExitTransition = shrinkHorizontally(navIconSpringSlide) + fadeOut()
val navIconEnterTransition:EnterTransition = expandHorizontally() + fadeIn()
val navIconExitTransition:ExitTransition = shrinkHorizontally() + fadeOut()
private val screenWidth = myContext.resources.displayMetrics.widthPixels
private val initialOffsetValue = screenWidth/12
private val targetOffsetValue = screenWidth/12
private val initialOffsetValue = screenWidth/8
private val targetOffsetValue = screenWidth/8
val navHostEnterTransition: AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = {
fadeIn(animationSpec = springFade) +
fadeIn(animationSpec = fade) +
slideIntoContainer(
animationSpec = springSlide,
animationSpec = spring,
towards = AnimatedContentTransitionScope.SlideDirection.End,
initialOffset = {initialOffsetValue}
)
}
val navHostExitTransition: AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = {
fadeOut(animationSpec = springFade) +
fadeOut(animationSpec = fade) +
slideOutOfContainer(
animationSpec = springSlide,
animationSpec = spring,
towards = AnimatedContentTransitionScope.SlideDirection.Start,
targetOffset = {-targetOffsetValue}
)
}
val navHostPopEnterTransition: AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = {
fadeIn(animationSpec = springFade) +
fadeIn(animationSpec = fade) +
slideIntoContainer(
animationSpec = springSlide,
animationSpec = spring,
towards = AnimatedContentTransitionScope.SlideDirection.End,
initialOffset = {-initialOffsetValue}
)
}
val navHostPopExitTransition: AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = {
fadeOut(animationSpec = springFade) +
fadeOut(animationSpec = fade) +
slideOutOfContainer(
animationSpec = springSlide,
animationSpec = spring,
towards = AnimatedContentTransitionScope.SlideDirection.Start,
targetOffset = {targetOffsetValue}
)