【发布时间】:2020-08-31 17:08:45
【问题描述】:
我正在创建一个文本组件,我希望默认为 2 行,如果用户点击它,它将展开到全长,如果用户再次点击它,它将折叠回2 行。
到目前为止,我的返回函数中有这样的东西:
<TouchableWithoutFeedback
onPress={() => {
toggleExpansion();
}}
>
<Animated.View style={[{ height: animationHeight }]}>
<Text
style={styles.textStyle}
onLayout={event => setHeight(event.nativeEvent.layout.height)}
numberOfLines={numberOfLines}
>
{longText}
</Text>
</Animated.View>
</TouchableWithoutFeedback>
我的状态变量和 toggleExpansion 函数如下所示:
const [expanded, setExpanded] = useState(false);
const [height, setHeight] = useState(0);
const [numberOfLines, setNumberOfLines] = useState();
const toggleExpansion = () => {
setExpanded(!expanded);
if (expanded) {
setNumberOfLines(undefined);
} else {
setNumberOfLines(2);
}
};
到目前为止,这可以展开和折叠,但我不确定如何设置 Animated.timing 函数来为其设置动画。我尝试过这样的事情:
const animationHeight = useRef(new Animated.Value(0)).current;
useEffect(() => {
Animated.timing(animationHeight, {
duration: 1000,
toValue: height,
easing: Easing.linear
}).start();
}, [height]);
但它并没有完全奏效。它根本不显示文本,当我尝试将新的 Animated.Value 初始化为比 2 行高更大的数字(如 50)时,无论我展开和折叠多少次,高度总是被截断为 16 .动画展开和折叠文本的最佳方式是什么?
【问题讨论】:
标签: typescript react-native react-animated