输入
⚠️ 弃用通知: 本页面全部 内容记录的是旧版输入系统。对于新项目: 请改用数据绑定。对于现有项目: 请尽快规划从输入迁移到数据绑定。此内容仅供旧版支持参考。
有关在 Rive 中创建输入的更多信息,请参阅:输入。
控制状态机输入
一旦 Rive 文件被加载和实例化,就可以查询状态机的输入,以编程方式设置这些输入值,并且在触发器的情况下可以触发它们。
输入也可以在运行时在组件上设置,请参见下面的嵌套输入。
新版运行时(推荐)
⚠️ 此功能已弃用。我们建议使用数据绑定。
您可以在视图引用上访问控制数据绑定输入的方法:
export default function StateMachineInputsExample() {
const { riveViewRef, setHybridRef } = useRive();
const { riveFile } = useRiveFile(require('../../assets/rive/rating.riv'));
useEffect(() => {
if (riveViewRef) {
try {
// 原始值
console.log(
'Number value: ',
riveViewRef.getNumberInputValue('rating')
);
// 设置输入值
riveViewRef.setNumberInputValue('rating', 3.0);
console.log(
'Number value: ',
riveViewRef.getNumberInputValue('rating')
);
// 添加延迟以允许视图控制器准备就绪
setTimeout(() => {
console.log(
'Number value after delay: ',
riveViewRef.getNumberInputValue('rating')
);
}, 16);
} catch (err) {
console.error(err);
}
}
}, [riveViewRef]);
return (
<View style={styles.riveContainer}>
{riveFile ? (
<RiveView
style={styles.rive}
autoPlay={true}
file={riveFile}
hybridRef={setHybridRef}
/>
) : null}
</View>
);
}
旧版运行时
使用 React Native 运行时,大多数方法/触发器在 Rive 组件的 ref 上都可用,包括设置状态机的输入值/触发。在这种情况下,无需获取输入的实例。只需从 Rive ref 设置输入状态或触发输入状态。
export default function StateMachine() {
const riveRef = React.useRef<RiveRef>(null);
// 在 React state 中维护状态机的值
const [selectedLevel, setSelectedLevel] = useState('2');
const setLevel = (n: number) => {
setSelectedLevel(n.toString());
// 无需获取状态机输入的实例,只需在 `riveRef` 本身上设置输入状态
riveRef.current?.setInputState("Designer's Test", 'Level', n);
};
return (
<SafeAreaView style={styles.safeAreaViewContainer}>
<ScrollView contentContainerStyle={styles.container}>
<Rive
resourceName={'skills'}
ref={riveRef}
autoplay={true}
stateMachineName="Designer's Test"
/>
<RadioButton.Group
onValueChange={(newValue) => setLevel(parseInt(newValue, 10))}
value={selectedLevel}
>
<View style={styles.radioButtonsWrapper}>
<View style={styles.radioButtonWrapper}>
<Text>{'Beginner'}</Text>
<RadioButton value={'0'} />
</View>
<View style={styles.radioButtonWrapper}>
<Text>{'Intermediate'}</Text>
<RadioButton value={'1'} />
</View>
<View style={styles.radioButtonWrapper}>
<Text>{'Expert'}</Text>
<RadioButton value={'2'} />
</View>
</View>
</RadioButton.Group>
</ScrollView>
</SafeAreaView>
);
}
参见 React Native API 了解
.setInputState()和.fireState()的参数。