Last active
July 4, 2024 12:57
-
-
Save mmazzarolo/cfd467436f9d110e94a685b06eb3900f to your computer and use it in GitHub Desktop.
react-native-action-button hide on scroll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 1. Define a state variable for showing/hiding the action-button | |
state = { | |
isActionButtonVisible: true | |
} | |
// 2. Define a variable that will keep track of the current scroll position | |
_listViewOffset = 0 | |
// 3. Add an onScroll listener to your listview/scrollview | |
<ListView | |
... | |
onScroll={this._onScroll} | |
... | |
/> | |
// 3. Add some logic in the scroll listener for hiding the action button when scrolling down | |
_onScroll = (event) => { | |
// Simple fade-in / fade-out animation | |
const CustomLayoutLinear = { | |
duration: 100, | |
create: { type: LayoutAnimation.Types.linear, property: LayoutAnimation.Properties.opacity }, | |
update: { type: LayoutAnimation.Types.linear, property: LayoutAnimation.Properties.opacity }, | |
delete: { type: LayoutAnimation.Types.linear, property: LayoutAnimation.Properties.opacity } | |
} | |
// Check if the user is scrolling up or down by confronting the new scroll position with your own one | |
const currentOffset = event.nativeEvent.contentOffset.y | |
const direction = (currentOffset > 0 && currentOffset > this._listViewOffset) | |
? 'down' | |
: 'up' | |
// If the user is scrolling down (and the action-button is still visible) hide it | |
const isActionButtonVisible = direction === 'up' | |
if (isActionButtonVisible !== this.state.isActionButtonVisible) { | |
LayoutAnimation.configureNext(CustomLayoutLinear) | |
this.setState({ isActionButtonVisible }) | |
} | |
// Update your scroll position | |
this._listViewOffset = currentOffset | |
} | |
// 4. In you render show you action-button only if state.isActionButtonVisible === true | |
<View style={styles.container}> | |
{yourListView} | |
{this.state.isActionButtonVisible ? <ActionButton /> : null} | |
</View> |
For those using functional components you could turn it into a hook like this
import { useState, useRef, useCallback } from 'react'; import { NativeSyntheticEvent, NativeScrollEvent, LayoutAnimation } from 'react-native'; const useHandleScroll = () => { const [showButton, setShowButton] = useState(true); const scrollOffset = useRef(0); const handleScroll = useCallback( (event: NativeSyntheticEvent<NativeScrollEvent>) => { const CustomLayoutLinear = { duration: 100, create: { type: LayoutAnimation.Types.linear, property: LayoutAnimation.Properties.opacity }, update: { type: LayoutAnimation.Types.linear, property: LayoutAnimation.Properties.opacity }, delete: { type: LayoutAnimation.Types.linear, property: LayoutAnimation.Properties.opacity }, }; // Check if the user is scrolling up or down by confronting the new scroll position with your own one const currentOffset = event.nativeEvent.contentOffset.y; const direction = currentOffset > 0 && currentOffset > scrollOffset.current ? 'down' : 'up'; // If the user is scrolling down (and the action-button is still visible) hide it const isActionButtonVisible = direction === 'up'; if (isActionButtonVisible !== showButton) { LayoutAnimation.configureNext(CustomLayoutLinear); setShowButton(isActionButtonVisible); } // Update your scroll position scrollOffset.current = currentOffset; }, [showButton] ); return { handleScroll, showButton }; }; export default useHandleScroll;
and then use it like this
const { handleScroll, showButton } = useHandleScroll(); <ScrollView onScroll={handleScroll} /> {showButton && <Button />}
i have a problem
when i use Animated.Scrollview and when i pass the parameter (handleScroll ) some other components in the screen also hid
thanks
any solution with Reanimated?? I dont want to useState + LayoutAnimation because it's may took glitch with Android
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
it happens only when scrolling slowly. Works like normal when scrolled in normal speed. My usecase is not an action button, instead it is a tabbar which autohides on scrolldown. That might be the root cause of this issue? any guesses