Search code examples
androidandroid-layoutandroid-jetpack-composeandroid-jetpack

How to do this Scroll hide fab button in Jetpack Compose with transaction


How to do this Scroll hide fab button in Jetpack Compose with transaction

Like this I need it:


Solution

  • You need to listen to the scroll state and apply AnimatedVisibiltiy. Here is an example using LazyColumn with LazyListState (you could also use Column with ScrollState)

    @Composable
    fun Screen() {
    
        val listState = rememberLazyListState()
        val fabVisibility by derivedStateOf {
            listState.firstVisibleItemIndex == 0
        }
    
        Box(modifier = Modifier.fillMaxSize()) {
            LazyColumn(
                Modifier.fillMaxSize(),
                state = listState,
            ) {
                items(count = 100, key = { it.toString() }) {
                    Text(modifier = Modifier.fillMaxWidth(),
                        text = "Hello $it!")
                }
            }
    
            AddPaymentFab(
                modifier = Modifier
                    .align(Alignment.BottomCenter)
                    .padding(bottom = 40.dp),
                isVisibleBecauseOfScrolling = fabVisibility
            )
        }
    }
    
    @Composable
    private fun AddPaymentFab(
        modifier: Modifier,
        isVisibleBecauseOfScrolling: Boolean,
    ) {
        val density = LocalDensity.current
        AnimatedVisibility(
            modifier = modifier,
            visible = isVisibleBecauseOfScrolling,
            enter = slideInVertically {
                with(density) { 40.dp.roundToPx() }
            } + fadeIn(),
            exit = fadeOut(
                animationSpec = keyframes {
                    this.durationMillis = 120
                }
            )
        ) {
            ExtendedFloatingActionButton(
                text = { Text(text = "Add Payment") },
                onClick = { },
                icon = { Icon(Icons.Filled.Add, "Add Payment") }
            )
        }
    }
    

    enter image description here