Анимировать развернутую / свернутую текстовую оболочку в react-native

#javascript #reactjs #react-native #native

#javascript #reactjs #react-native #родной

Вопрос:

Я новичок в react-native dev, я хочу иметь простой эффект расширения / высоты слайда после нажатия кнопки, я пытался следовать документам, но анимация react-native совершенно нелепа, имхо.

Мой код довольно прост, представление, которое я хочу анимировать, — это оболочка представления вокруг текста с помощью props.item.body после нажатия на расширенный обратный вызов. Это представление:

 const [ isExpanded, setIsExpanded ] = useState(false);
    const [ maxHeight, setMaxHeight ] = useState(null);
    const [ minHeight, setMinHeight ] = useState(null);
    const [ animation, setAnimation ] = useState(new Animated.Value());
   

    const toggleIsExpanded = () => 
    {
        setIsExpanded(!isExpanded);
    };


<View style={{ width:'100%', flexDirection:'column', position:'relative',}}>
                    <TouchableOpacity style={{ width:'100%', height:50}} onPress={ toggleIsExpanded }>
                        <EntypoIcon name="chevron-small-down" style={{ color:'rgb(68,68,68)', fontSize:20 }}/>
                    </TouchableOpacity>
                    {//How to expand/collapse this?}
                    <View style={{ width:'100%', padding:10 }}>
                        <Text style={{ fontSize:14, color:'rgb(68,68,68)' }}>{ props.item.body }</Text>
                    </View>
                </View>
  

Кто-нибудь может мне помочь?

Ответ №1:

Большую часть времени Animated хорошо работает в сценариях, где ширина, непрозрачность и т. Д. Являются Заранее известными значениями. Однако в этом случае высота Text полностью зависит от длины тела, и это значение трудно вычислить.

По моему опыту LayoutAnimation , лучше всего работает в этих сценариях, вы просто указываете прямо перед вашим установленным состоянием, что анимация произойдет после изменения состояния. LayoutAnimation выясняет остальное.

Для получения дополнительной информации ознакомьтесь с документацией.

Для обновления вашего кода:

     const defaultAnimation = {
      duration: 200,
      create: {
        duration: 200,
        type: LayoutAnimation.Types.easeInEaseOut,
        property: LayoutAnimation.Properties.opacity,
      },
      update: {
        type: LayoutAnimation.Types.easeInEaseOut,
      },
    };


    const [ isExpanded, setIsExpanded ] = useState(false);
    const [ maxHeight, setMaxHeight ] = useState(null);
    const [ minHeight, setMinHeight ] = useState(null);
   

    const toggleIsExpanded = () => 
    {
        // This will make sure an animation is trigger after toggling
        LayoutAnimation.configureNext(defaultAnimation);
        setIsExpanded(prev => !prev);
    };

    return (
       <View style={{ width:'100%', flexDirection:'column', position:'relative',}}>
           <TouchableOpacity style={{ width:'100%', height:50}} onPress={ toggleIsExpanded }>
               <EntypoIcon name="chevron-small-down" style={{ color:'rgb(68,68,68)', fontSize:20 }}/>
           </TouchableOpacity>
           {//How to expand/collapse this?}
           {!!expanded amp;amp; (
           <View style={{ width:'100%', padding:10 }}>
               <Text style={{ fontSize:14, color:'rgb(68,68,68)' }}>{ props.item.body }</Text>
           </View>)}
       </View>
    );