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.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.* import androidx.compose.foundation.*
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape

View File

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