برنامه نویسی

📸 پیش نمایش تصویر خیره کننده در React Native – کشویی و چرخش! 🚀

در دنیای دیجیتال امروز ، تصاویر نقش مهمی در تقویت تجربه کاربر دارند. یک چرخ فلک تصویر زیبا را تصور کنید که در آن کاربران نه تنها می توانند از طریق تصاویر به هم بزنند بلکه پیش نمایش و آنها را یکپارچه بچرخانند! 🎉

در این راهنما ، ما یک بیننده تصویر تعاملی را در React Native با امکان باز کردن تصاویر در پیش نمایش تمام صفحه ، به صورت افقی از طریق آنها کشیدیم و حتی آنها را بچرخانیم! 🔄🔥

شرح تصویر

✅ گالری پیمایش افقی
review پیش نمایش تصویر تمام صفحه
navion ناوبری کش رفتن صاف
support پشتیبانی چرخش تصویر

بیایید شیرجه بزنیم و این جادو را به زندگی بیاوریم! ✨


اول ، بیایید اصلی خود را ایجاد کنیم تصویر مؤلفه ، که لیستی از تصاویر را در یک پیمایش افقی نشان می دهد لیست مسطحبشر هنگامی که یک کاربر یک تصویر را برطرف می کند ، در پیش نمایش تمام صفحه باز می شود. 🖼

📜 ImageView.js

import {
  FlatList,
  Image,
  Modal,
  StyleSheet,
  TouchableOpacity,
  useWindowDimensions,
  View,
} from 'react-native';
import React, {useCallback, useState, useRef} from 'react';
import {CloseIcon, RotateIcon} from '../../assets';

const ImagePreview = ({flatListRef, data, selectedIndex, closePreview}) => {
  const {width, height} = useWindowDimensions();
  const listRef = useRef(null);
  const [currentIndex, setCurrentIndex] = useState(selectedIndex || 0);
  const [rotationMap, setRotationMap] = useState({});

  const rotateImage = () => {
    setRotationMap(prev => ({
      ...prev,
      [currentIndex]: prev[currentIndex] === 90 ? 0 : 90,
    }));
  };

  const renderItem = useCallback(
    ({item, index}) => {
      const rotation = rotationMap[index] || 0;
      return (
        
          
        
      );
    },
    [rotationMap],
  );

  const onMomentumScrollEnd = useCallback(
    event => {
      const newIndex = Math.round(event.nativeEvent.contentOffset.x / width);
      setCurrentIndex(newIndex);
    },
    [width],
  );

  const getItemLayout = useCallback(
    (_, index) => ({
      length: width,
      offset: width * index,
      index,
    }),
    [width],
  );

  return (
    
      
        
          
        
        
          
        

         0}
          keyExtractor={(_, index) => index.toString()}
          initialScrollIndex={selectedIndex}
          getItemLayout={getItemLayout}
          onMomentumScrollEnd={onMomentumScrollEnd}
          showsHorizontalScrollIndicator={false}
          renderItem={renderItem}
        />
      
    
  );
};

export default ImagePreview;

const styles = StyleSheet.create({
  imageContainer: (width, height) => ({
    width: width - 40,
    height,
    justifyContent: 'center',
    alignItems: 'center',
    marginHorizontal: 20,
  }),
  image: (width, height, rotation) => ({
    width: rotation % 180 === 0 ? width - 40 : height - 340,
    height: rotation % 180 === 0 ? height - 340 : width - 40,
    resizeMode: rotation % 180 === 0 ? 'cover' : 'contain',
    transform: [{rotate: `${rotation}deg`}],
    borderRadius: 14,
  }),
  closeButton: {
    position: 'absolute',
    top: 70,
    right: 20,
    zIndex: 10,
  },
  rotateButton: {
    position: 'absolute',
    top: 70,
    left: 20,
    zIndex: 10,
  },
  modalContainer: {
    flex: 1,
    backgroundColor: '#000000D0',
    justifyContent: 'center',
    alignItems: 'center',
  },
});

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 در اینجا ، از لیست Flatlist برای ایجاد یک لیست قابل پیمایش افقی از تصاویر استفاده می شود.
🔹 TouchableOpacity اجازه می دهد تا روی تصاویر ضربه بزنید تا پیش نمایش را تحریک کند.
🔹 USECALLBACK & USEMEMO عملکرد رندر را بهینه سازی می کند.


حال ، بیایید ایجاد کنیم تصویر مؤلفه ، که تصویر انتخاب شده را در حالت تمام صفحه با توانایی نشان می دهد چرخیدن! 🔄

📜 ImagePreview.js

import {
  FlatList,
  Image,
  StyleSheet,
  TouchableOpacity,
  View,
} from 'react-native';
import React, { useCallback, useState, useRef, useMemo } from 'react';
import { metaData } from '../../screens/CarouselBackgroundAnimation/data';
import ImagePreview from './ImagePreview';

const ImageView = () => {
  const [selectedIndex, setSelectedIndex] = useState(null);
  const flatListRef = useRef(null);

  const handlePreview = (index = null) => setSelectedIndex(index);

  const renderItem = useCallback(
    ({ item, index }) => (
       handlePreview(index)}
        activeOpacity={0.8}
      >
        
      
    ),
    []
  );

  const keyExtractor = useCallback((_, index) => index.toString(), []);

  const memoizedFlatList = useMemo(
    () => (
      
    ),
    [renderItem]
  );

  return (
    
      {memoizedFlatList}
      {selectedIndex !== null && (
         handlePreview(null)}
        />
      )}
    
  );
};

export default ImageView;

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
  },
  imageContainer: {
    alignSelf: 'center',
    borderRadius: 14,
    overflow: 'hidden',
  },
  imageStyle: {
    width: 250,
    height: 400,
    borderRadius: 14,
  },
  contentContainerStyle: {
    gap: 24,
    paddingHorizontal: 24,
  },
});

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 لیست مسطح در داخل معین اجازه می دهد تا به صورت افقی بکشید.
butt دکمه های TouchableOpacity به کاربران اجازه می دهید که معین را ببندند یا تصویر را بچرخانند.
🔹 حالت چرخش تضمین می کند که هر تصویر چرخش خود را به یاد می آورد! 🌀


ما فقط یک بیننده کاملاً تعاملی که به کاربران امکان می دهد پیش نمایش ، کشیدن و چرخش تصاویر یکپارچه! 🎊 این که آیا شما در حال ساختن یک برنامه تجارت الکترونیکی ، گالری یا یک برنامه داستان پردازی هستید ، این ویژگی اضافه می کند واو عامل به تجربه کاربر خود! 💯

🔹 مرحله بعدی؟ برای یک تجربه حتی غنی تر سعی کنید Pinch-to-Joom را اضافه کنید! 😉

🔥 نظر شما چیست؟ آیا این را به پروژه خود اضافه می کنید؟ بیایید در نظرات بحث کنیم! 🚀

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا