I have some code that has pairs of images in a swipeable horizontal gallery. Now when you click on the upper part of both images the images should toggle off, so what I did is I set isImage2Active to the state and then just toggle their source. On iOS it works perfectly and completely smooth, but on Android it almost doesn't work at all. It might change if you click on it often, but that's obviously not the behavior I want.
So I have an image component which is the slideable horizontal gallery as described
const Images = () => { const [currentPage, setCurrentPage] = useState(0); const swiperRef = useRef(null); return ( <> <FlashList data={item.posts} horizontal={true} pagingEnabled={true} keyExtractor={(item) => item.id} estimatedItemSize={350} renderItem={({ item }) => { return ( <> <GalleryImage item={item} /> </> ); }} /> {currentPage !== 2 && ( <> <Pressable style={{ flex: 1, backgroundColor: "white", flexDirection: "row", zIndex: 1, }} onPress={() => { setCurrentPage(currentPage + 2); }} > <Image style={{ position: "absolute", bottom: 20, right: 20, width: 60, height: 80, zIndex: 1, borderRadius: 15, borderWidth: 1.5, borderColor: "black", }} source={item.photoUrl2} blurRadius={100} /> </Pressable> </> )} <Pressable style={{ flex: 1, backgroundColor: "white", flexDirection: "row", zIndex: 1, }} onPress={switchToMatch} > <Image style={{ position: "absolute", bottom: 20, left: 20, width: 50, height: 50, zIndex: 1, borderRadius: 50, }} source={ showMatchPost ? "https://i.pinimg.com/474x/2c/86/be/2c86be60d12339b29609532bcbdf6895.jpg" : "https://i.pinimg.com/474x/63/3e/c1/633ec1cf306c5ec2bc4e37d1ff6afa83.jpg" } /> </Pressable> </> ); };
Then inside I have the Image component and when I click on the above image inside the Pressable component it should trigger handleImagePress and then change setIsImage2Active and then switch the source of the image but it doesn't really work on Android and it's 20 It works 1 out of 10 times, and it only works if you click on it like crazy. Is this a performance issue, or an issue with the Pressable component? I'm really frustrated right now.
const GalleryImage = React.memo(({ item }) => { const [isImage2Active, setIsImage2Active] = useState(false); const [showMatchPost, setShowMatchPost] = useState(false); const handleImagePress = useCallback(() => { setIsImage2Active(!isImage2Active); }, [isImage2Active]); const switchToMatch = useCallback(() => { setShowMatchPost(!showMatchPost); }, [showMatchPost]); return ( <> <View style={{ justifyContent: "center", alignItems: "center", flex: 1, width: 390, // or use a fixed value if you prefer }} > <Pressable style={{ position: "absolute", top: 20, right: 20, backgroundColor: "white", flexDirection: "row", zIndex: 1000, }} onPress={handleImagePress} > <Image style={{ position: "absolute", top: 0, right: 0, width: 100, height: 150, zIndex: 1, borderRadius: 15, }} source={ isImage2Active ? showMatchPost ? item.photoUrl2 : item.photoUrl1 : showMatchPost ? item.photoUrl1 : item.photoUrl2 } /> </Pressable> <Image style={{ width: "100%", height: 390 }} source={ isImage2Active ? showMatchPost ? item.photoUrl1 : item.photoUrl2 : showMatchPost ? item.photoUrl2 : item.photoUrl1 } blurRadius={0} /> </View> </> ) })
I tried putting it into a FlatList (Spotify's FlashList, this should improve performance) because before I had a PagerView and mapped all the posts, then handleImagePress would change all the images to isImage2Active, which are from the gallery part, but now I'm using a separate Image component instead, so only one Image needs to be updated, but the performance has improved by 0.
const [isImage2Active, setIsImage2Active] = useState(false); const [showMatchPost, setShowMatchPost] = useState(false); const handleImagePress = useCallback(() => { setIsImage2Active(!isImage2Active); }, [isImage2Active]); return ( <> <View style={{ flex: 1, width: 100, height: 100, }}> <Pressable style={{ flex: 1, width: 100, height: 100, borderRadius: 20 }} onPress={handleImagePress}> <Image style={{ flex: 1, width: 100, height: 100, borderRadius: 20 }} source={isImage2Active ? "https://i.pinimg.com/474x/f3/7c/ff/f37cfff4e11964b9ae846f901965cc5e.jpg" : "https://i.pinimg.com/474x/fa/84/56/fa84564e78db58b48e10a245bb7fdb56.jpg"} /> </Pressable> </View> </> )
I also created another screen and I tested it using only 1 image and it worked fine, but inside the FlatList, I have extreme performance issues.
Try to optimize your FlatList performance and images. As I see they are fetched from remote URL, try to optimize there by preloading images or better still use some optimized image library like
react-native-fast-image
Load the image directly.