我一直在使用React Native和Redux构建一个应用程序,以评估是否将它用于即将到来的Swift项目并完全本机化.
我真的相信Dan Abramov与Redux的技术是一个坚实的工程案例.不更新状态并将视图视为状态的函数是很好的,我非常关注这个想法.我有点失意的地方是将动画投入混音中.
更复杂的动画需要状态管理,例如,淡出视图,替换文本并将其淡入.我只想在动画中途更新文本,这很容易使用本地状态和杠杆作用动画框架.
假设要显示的文本是由状态驱动的,它会在状态通过适当的动作和缩减器组合更改时更新,但为了演示,我需要在这两个动画之间进行更新.
一个例子是从列表中选择一个记录,其中有一个屏幕上的标签显示所选记录的名称.理想情况下,您希望立即更新全局存储,但在标签本身上执行一个很好的转换.
在我看来,在组件内部使用"本地状态"来处理动画是有一定意义的,而主要的Redux存储则用于更多的整体数据或架构状态.问题是这打破了视图是全局状态的一个功能的想法,我不确定它是否适合我.
另一方面,通过编写大量动作,减少器和使商店混乱来管理动画序列等也感觉不干净.
我知道React Native处于初期阶段,并不是每个人都在使用Redux,但在这种情况下是否有一种普遍接受的管理动画的方法?
我试图让这张卡在每次组件加载时淡入,并在使用钩子卸载后淡出,但我没能做到这一点,迫切需要有人的帮助。请你告诉我如何在每次加载和卸载这张卡时使用动画hooks
这是我的组件:
import React, { useState } from "react";
const Home = (props) => {
const renderCard = ({ item }) => {
return (
//I am trying to add a fadein to this everytime it loads and fadout when It unmounts
<View>
<Text style={styles.day}>{item}</Text>
<MealCards
item={state[item]}
navigation={navigation}
onChange={onChange}
/>
<View style={styles.divider} />
</View>
);
};
return (
<FlatList
data={days}
keyExtractor={(item) => item}
showsHorizontalScrollIndicator={false}
renderItem={renderCard}
/>
);
};
Run Code Online (Sandbox Code Playgroud) 我在具有平移的动画视图中有一个ScrollView。
<Animated.View {...this.panResponder.panHandlers}>
<ScrollView>
...
</ScrollView>
<Animated.View>
Run Code Online (Sandbox Code Playgroud)
这是我的屏幕的示例视图:
用户应该能够向上滑动,而可拖动区域应该向上捕捉,如下所示:
现在我的问题是Scrollview。我希望用户能够在其中滚动内容。
用户查看完内部内容并向上滚动(通过执行向下滑动动作)并尝试进一步滑动之后,可拖动区域应向下移动到其原始位置。
我尝试了各种方法,主要侧重于禁用和启用ScrollView的滚动,以防止其干扰平移。
我当前的解决方案并不理想。
我的主要问题是这两种方法:
onStartShouldSetPanResponder
onStartShouldSetPanResponderCapture
Run Code Online (Sandbox Code Playgroud)
不知道我的假设是否正确,但是这些方法决定了View是否应捕获触摸事件。我要么允许平移,要么让ScrollView捕获事件。
我的问题是我需要以某种方式知道用户打算在其他平移处理程序加入之前做什么。但是我无法知道,直到用户向下或向上移动为止。要知道方向,我需要事件传递给onPanResponderMove处理程序。
因此,从本质上讲,我什至在不知道用户滑动方向之前,需要决定是否应该拖动视图。目前这是不可能的。
希望我在这里想念一些简单的东西。
编辑:找到一个类似的问题(无答案): 向上拖动ScrollView,然后在React Native中继续滚动
我有一个待办事项列表,每个列表项都有一个复选框。当我选中该框时,应从左到右显示动画删除线效果。怎么做?
我想复制长按来录制并向左滑动来取消whatsapp/viber Messenger。
import React, {useRef, useState} from 'react';
import {
Dimensions,
TextInput,
TouchableWithoutFeedback,
View,
PanResponder,
Animated as NativeAnimated,
} from 'react-native';
import Animated, {Easing} from 'react-native-reanimated';
import styled from 'styled-components';
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
const {Value, timing} = Animated;
let isMoving = false;
const width = Dimensions.get('window').width;
const height = Dimensions.get('window').height;
const RecordButton = ({onPress, onPressIn, onPressOut}) => (
<RecordButton.Container
accessibilityLabel="send message"
accessibilityRole="button"
accessibilityHint="tap to send message">
<TouchableWithoutFeedback
delayPressOut={900}
pressRetentionOffset={300}
onPress={onPress}
onPressIn={onPressIn}
onPressOut={onPressOut}>
<RecordButton.Icon />
</TouchableWithoutFeedback>
</RecordButton.Container>
);
RecordButton.Container = …Run Code Online (Sandbox Code Playgroud) 我碰巧有一个从 -1 到 1 的动画,我想将这些值转换为以下 2 个字符串:
如果值为负,则为“上一个”。
如果值为正,则为“下一步”。
this.state.anim.interpolate({
inputRange: [-1, 0, 1],
outputRange: ['Previous','', 'Next'],
})
Run Code Online (Sandbox Code Playgroud)
问:我如何使用this.state.anim包含的值来决定我们是去下一个屏幕还是前一个屏幕。
更多信息:
this.state.anim从 a 接收它的值PanGesture,我也this.state.anim用于许多其他事情,所以在这里不使用它也是一种耻辱。
嗨,我希望animated.view像圆圈一样移动.我用窦思考这个但是它不起作用.有人知道怎么做吗?我不想旋转视图.它应该在圆圈中移动.我是新来的本地人.如果有人可以帮助我会很好.
//import liraries
import React, { Component } from 'react';
import { View, Text, StyleSheet, Animated, Button, TouchableOpacity } from 'react-native';
// create a component
class MyClass extends Component {
constructor() {
super()
this.animated = new Animated.Value(0);
}
animate() {
this.animated.setValue(0)
Animated.timing(this.animated, {
toValue: Math.PI *2,
duration: 1000,
}).start();
}
render() {
const translateY = this.animated.interpolate({
inputRange: [0, Math.PI *2],
outputRange: [0, 200]
});
const translateX = translateY
const transform = [{ translateY }, {translateX}];
return (
<View style={styles.container}>
<Animated.View …Run Code Online (Sandbox Code Playgroud) 我正在创建一个文本组件,默认情况下我希望它是 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>
Run Code Online (Sandbox Code Playgroud)
我的状态变量和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);
}
};
Run Code Online (Sandbox Code Playgroud)
到目前为止,这可以展开和折叠,但我不确定如何设置 Animated.timing 函数来为其设置动画。我尝试过这样的事情:
const animationHeight = useRef(new Animated.Value(0)).current;
useEffect(() => {
Animated.timing(animationHeight, {
duration: 1000,
toValue: height,
easing: …Run Code Online (Sandbox Code Playgroud) 目标:有一个下拉视图,可以随着时间的推移对高度扩展进行动画处理。需要注意的是:一旦视图展开,它需要能够动态处理是否存在其他视图数据。如果存在,将呈现一些额外的文本组件。
问题:就目前而言,动画将父级的高度设置为固定高度。因此,当 被additionalContent渲染时,它超出了父级的边界,而父级的高度是固定的。我不想明确设置父级的高度,因为这样我就无法按照我想要的方式为该方面设置动画。我想按原样维护高度动画,并动态调整父级的大小以在additionalContent存在时包含子级
const ListItem = (props) => {
const [checkInModal, setCheckInModal] = useState(false);
const [animatedHeight, setAnimatedHeight] = useState(new Animated.Value(0))
const [animatedOpacity] = useState(new Animated.Value(0))
const [dynamicHeight, setDynamicHeight] = useState(0);
const [expanded, setExpanded] = useState(false);
const toggleDropdown = () => {
if (expanded == true) {
// collapse dropdown
Animated.timing(animatedHeight, {
toValue: 0,
duration: 200,
}).start()
} else {
// expand dropdown
Animated.timing(animatedHeight, {
toValue: 100,
duration: 200,
}).start()
}
setExpanded(!expanded)
}
const renderAdditionalContent …Run Code Online (Sandbox Code Playgroud) 我一直在学习 React Native,并且正在尝试学习动画。
经过一番搜索并发现可能性后,我发现您可以使用React-native 中的Animated组件,但也可以使用Reanimated库,它应该可以使动画任务变得更容易。
两者之间存在一些差异,但我想学习一个并坚持下去,直到我认为我对它有了很好的了解。
您认为哪一款最好?
react-animated ×10
react-native ×10
reactjs ×4
javascript ×3
animation ×2
architecture ×1
opacity ×1
react-hooks ×1
redux ×1
typescript ×1