I want to to a horizontal ScrollView with pagination enabled with one special requirement: each page (or card) is 90% of the container wide. The remaining 10% should be a preview of the next page.
It is possible to do this with ScrollView? Can I somehow specify the width of the pagination instead of taking the width of the container?
(image taken from this similar question: React Native Card Carousel view?)
You can absolutely do that with
ScrollView
or, even better,FlatList
. However, the really tricky part is the snapping effect. You can use propssnapToInterval
andsnapToAlignment
to achieve it (see Vasil Enchev's answer); unfortunately, these are iOS-only.A co-worker and I created a plugin that answers this particular need. We ended up open-sourcing it, so it's all yours to try:
react-native-snap-carousel
.The plugin is now built on top of
FlatList
(versions >= 3.0.0), which is great to handle huge numbers of items. It provides previews (the effect you're after), snapping effect for iOS and Android, parallax images, RTL support, and more.You can take a look at the showcase to get a grasp of what can be achieved with it. Do not hesitate to share your experience with the plugin since we're always trying to improve it.
Edit : two new layouts have been introduced in version
3.6.0
(one with a stack of cards effect and the other with a tinder-like effect). Enjoy!You can look at
contentOffset
andscrollTo
property of ScrollView . Logically what you can do is whenever the page changes(mostly when moved to next page) you can provide a extra offset of 10% or so as per your need so that the next item in the scrollview becomes visible .Hope this helps, let me know if you need any extra details .
I spend a lot of time fighting with this until I figured it out so here is my solution if it helps someone.
https://snack.expo.io/H1CnjIeDb
Problem was all these were required and pagination should be turned off
You can pass a horizontal props to your scroll view:
https://facebook.github.io/react-native/docs/scrollview.html#horizontal
And then you can create a view inside to specify your width requirements.