Demo
Installation
This package has a dependency of React Native Elements. Install RNE first with:
yarn add react-native-elements
(make sure the version is 0.19.1
)
Finally install this package using yarn or npm:
yarn add react-native-parallax-scrollview
Usage
Default Profile Component
import ParallaxScrollView from 'react-native-parallax-scrollview';
<ParallaxScrollView />
Default header view with custom User
<ParallaxScrollView
windowHeight={SCREEN_HEIGHT * 0.4}
backgroundSource='http://i.imgur.com/UyjQBkJ.png'
navBarTitle='John Oliver'
userName='John Oliver'
userTitle='Comedian'
userImage='http://i.imgur.com/RQ1iLOs.jpg'
leftIcon={{name: 'rocket', color: 'rgba(131, 175, 41, 1)', size: 30, type: 'font-awesome'}}
rightIcon={{name: 'user', color: 'rgba(193, 193, 193, 1)', size: 30, type: 'font-awesome'}}
/>
Default Header view & Custom ScrollView content
<ParallaxScrollView
windowHeight={SCREEN_HEIGHT * 0.4}
backgroundSource='http://i.imgur.com/UyjQBkJ.png'
navBarTitle='John Oliver'
userName='John Oliver'
userTitle='Comedian'
userImage='http://i.imgur.com/RQ1iLOs.jpg'
leftIcon={{name: 'rocket', color: 'rgba(193, 193, 193, 1)', size: 30, type: 'font-awesome'}}
rightIcon={{name: 'user', color: 'rgba(193, 193, 193, 1)', size: 30, type: 'font-awesome'}}
>
<ScrollView style={{flex: 1, backgroundColor: 'rgba(228, 117, 125, 1)'}}>
<View style={{height: 300, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{fontSize: 32, color: 'white'}}>Custom view</Text>
</View>
<View style={{height: 300, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{fontSize: 32, color: 'white'}}>keep going.</Text>
</View>
<View style={{height: 300, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{fontSize: 32, color: 'white'}}>keep going..</Text>
</View>
<View style={{height: 300, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{fontSize: 32, color: 'white'}}>keep going...</Text>
</View>
<View style={{height: 300, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{fontSize: 32, color: 'white'}}>the end! :)</Text>
</View>
</ScrollView>
</ParallaxScrollView>
Custom Header view & ScrollView content
<ParallaxScrollView
windowHeight={SCREEN_HEIGHT}
backgroundSource='http://i.imgur.com/s4JEY9E.jpg'
navBarTitle='Custom Title'
navBarTitleColor='black'
navBarColor='white'
headerView={(
<View style={styles.headerView}>
<View style={styles.headerTextView}>
<Text style={styles.headerTextViewTitle}>My App</Text>
<Text style={styles.headerTextViewSubtitle}>
Custom Header View
</Text>
</View>
</View>
)}
leftIcon={{name: 'rocket', color: 'rgba(228, 117, 125, 1)', size: 30, type: 'font-awesome'}}
leftIconOnPress={() => this.setState({index: (this.state.index + 1 ) % 3})}
rightIcon={{name: 'user', color: 'rgba(228, 117, 125, 1)', size: 30, type: 'font-awesome'}}
rightIconOnPress={() => this.setState({index: (this.state.index + 1 ) % 3})}
>
<ScrollView style={{flex: 1, backgroundColor: 'rgba(228, 117, 125, 1)'}}>
<View style={{height: 300, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{fontSize: 32, color: 'white'}}>Custom view</Text>
</View>
<View style={{height: 300, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{fontSize: 32, color: 'white'}}>keep going.</Text>
</View>
<View style={{height: 300, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{fontSize: 32, color: 'white'}}>keep going..</Text>
</View>
<View style={{height: 300, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{fontSize: 32, color: 'white'}}>keep going...</Text>
</View>
<View style={{height: 300, justifyContent: 'center', alignItems: 'center'}}>
<Text style={{fontSize: 32, color: 'white'}}>the end! :)</Text>
</View>
</ScrollView>
</ParallaxScrollView>
API
prop | default | type | description |
---|---|---|---|
backgroundSource | {uri:http://i.imgur.com/6Iej2c3.png} | ImageSourcePropType | The background image for the header. The image source is (either a remote URL or a local file resource) backgroundSource={{uri:http://i.imgur.com/6Iej2c3.png}} or backgroundSource={require('./image.png')} |
onBackgroundLoadEnd | none | callback | Callback function when the background finishes loading (either with success or failure) |
onBackgroundLoadError | none | callback | Callback function when the background loading fails (an object is received with the error details) |
windowHeight | SCREEN_HEIGHT * 0.5 | number | The height of the header window |
navBarTitle | Katy Friedson | string | The title to be display on the NavBar header |
navBarTitleColor | 'white' | string | Color of the navBar title when displayed |
navBarColor | 'rgba(0, 0, 0, 1.0)' | string | Color of the navbar when shown |
navBarHeight | 65 | number | Height of the navBar when displayed |
navBarView | Left/Right Icons View | custom object | Pass in a custom object to override the default navigation bar view |
userName | Katy Friedson | string | The user name displayed in the collapsable header view |
userImage | http://i.imgur.com/uma9OfG.jpg | string | The user image displayed in the collapsable header view |
userTitle | Engineering Manager | string | The user title displayed in the collapsable header view |
headerView | Profile View | custom object | Pass in a custom object to override the default header view |
leftIcon | none | object | Pass in the left icon name and type as an object. leftIcon={{name: 'rocket', color: 'red', size: 30, type: 'font-awesome'}} |
leftIconOnPress | none | callback | Callback function when the left icon is pressed |
leftIconUnderlayColor | 'transparent' | string | Underlay color for the left icon. |
rightIcon | none | object | Pass in the right icon name and type etc as an object. rightIcon={{name: 'user', color: 'blue', size: 30, type: 'font-awesome'}} |
rightIconOnPress | none | callback | Callback function when the right icon is pressed |
rightIconUnderlayColor | 'transparent' | string | Underlay color for the right icon. |
children | List View | React Components | Render any react views/components as children and these will be rendered below the headerView |
Try it out
You can try it out with Exponent here
Example
Look at the example
folder to run the expo app locally.
Motivation
Currently there are a couple packages that provide a similar parallax Scrollview component (here and here) although both of them are not maintained and wasn't exactly what I was looking for.
So I challenged myself to create a Parallax ScrollView component (using react-native-parallax-view as a base) with
- Sticky NavBar Header 🎉
- An awesome default profile component that just works out of the box (
<ParallaxScrollView />
) - Flexible and comprehensive API to use the ScrollView component for any use case.
aka it's a (Parallax) ScrollView component for React Native that we truly deserve 🚀
Feedback
This repo is being actively manitained. Feel free to open a new Issue with a Feature Request
or submit a PR with an Enhancement
.