在 React Native 中解析没有分数的动画值

在 React Native 中解析没有分数的动画值
在 React Native 中解析没有分数的动画值

了解如何在 React Native 中解析动画值

React Native动画 API 提供了强大的动画工具,使开发人员能够构建无缝过渡和动态视觉效果。然而,开发人员经常遇到的一个问题是构建动画值的输出。

使用 Animated.Text 时,这些值有时可能包含小数整数,这可能不是所有使用场景都需要的。例如,显示整数值而不是分数是一个典型的要求,特别是对于进度条和音量指示。

这篇文章将展示如何在 React Native 中解释动画数据并将其格式化为整数。我们将通过一个示例来说明如何使用这些想法来解决典型的解析挑战。

我们还将研究替代方案,例如使用其他库或方法,以便在内置的情况下获得所需的输出 动画API 无法正常运行。

命令 使用示例
Animated.sequence() 该函数生成一系列依次播放的动画。它可以方便地将许多动画链接在一起,这是复杂的过渡(例如毫升级别之间的动画)所必需的。
Animated.timing() 该命令用于生成基于时间的动画。在示例中,它用于在设定的持续时间内对 ml 的值进行动画处理,使该值在预定级别之间平稳流动。
Easing.bezier() 此命令用于创建自定义缓动曲线。它可以精确控制各个位置的动画速度,从而产生更真实或更独特的过渡。
useAnimatedStyle() 特定于 React Native Reanimated 的挂钩,允许使用共享动画变量更新样式。它将动画值动态绑定到视觉元素。
withSequence() Reanimated 库中的一个命令,允许您连续链接多个动画,与 Animated.sequence() 相当,但针对 Reanimated API 进行了优化。
useSharedValue() 该钩子创建并管理动画的共享值。这是 Reanimated 的一个功能,可确保动画属性顺利更新。
interpolate() 此方法将输入值转换为输出值,允许您根据范围更改动画值。将动画毫升值转换为可用格式(例如舍入为整数)至关重要。
toFixed() JavaScript toFixed() 方法将数字四舍五入到指定的小数位数。在这种情况下,它用于通过将精度设置为零来将动画值转换为整数。

优化 React Native 中的动画值解析

上面的代码示例展示了如何在 React Native 中将动画值解释和显示为整数 动画 API。在第一个示例中,我们使用 React Native 的“Animated.sequence()”和“Animated.timing()”方法在预定级别之间对数字进行动画处理。该动画序列刷新参考值,然后使用“Animated.Text”组件显示该参考值。然而,动画值通常以浮点数返回,因此很难将它们转换为整数。

该解决方案包括利用“interpolate()”和“toFixed(0)”来确保动画编号在显示之前四舍五入到最接近的整数。插值在这种情况下非常有用,因为它允许我们将动画的输入范围(例如 0 到 1000)映射到定义的输出范围。这确保了我们的值保持在正确的范围内,同时在级别之间无缝过渡。使用“toFixed(0)”将小数精度设置为零,实质上是将数字四舍五入为整数。

第二种解决方案使用 复活 包,它提供了更全面的 API 来处理 React Native 中的动画。 Reanimated 包括“useSharedValue()”和“useAnimatedStyle()”等挂钩,可实现更高效、响应更灵敏的动画。在此方法中,我们通过链接“withSequence()”和“withTiming()”函数来更新动画值,以提供状态之间的平滑转换。这里的主要好处是 Reanimated 提供的性能优化,特别是在处理更复杂的动画时。

在这两种情况下,错误管理和性能优化都至关重要。我们通过跳过本机驱动程序(因为我们正在处理文本等非变换属性)和一系列链接动画来确保动画高效运行。此外,所有动画值都在 React 生命周期内使用“useRef()”和“useEffect()”进行管理。这保证了在安装或更新组件时动画能够正确开始和更新。这两种方法都是模块化且可重复使用的,因此适合任何需要平滑、非分数动画数字的应用程序。

在 React Native 中将动画值解析为整数

使用动画 API 和 React Hooks 进行 React Native

import { Animated, Easing } from 'react-native';
import React from 'react';
export default function Milliliters() {
  const ML_LEVELS = [240, 50, 190];
  const ml = React.useRef(new Animated.Value(ML_LEVELS[0])).current;
  const ml_up_down = () => {
    Animated.sequence([
      Animated.timing(ml, {
        duration: 2000,
        toValue: ML_LEVELS[1],
        easing: Easing.bezier(0.55, 0.5, 0.45, 0.5),
        useNativeDriver: false,
      }),
      Animated.timing(ml, {
        duration: 2000,
        toValue: ML_LEVELS[2],
        easing: Easing.ease,
        useNativeDriver: false,
      }),
    ]).start();
  };
  return (
    <Animated.Text>{ml.interpolate({
      inputRange: [0, 1000],
      outputRange: ['0', '1000'],
      extrapolate: 'clamp',
    }).toFixed(0)}</Animated.Text>
  );
}

替代解决方案:使用外部库进行解析

React Native 与 Reanimated 库

import Animated, { Easing } from 'react-native-reanimated';
import React from 'react';
export default function Milliliters() {
  const ML_LEVELS = [240, 50, 190];
  const ml = useSharedValue(ML_LEVELS[0]);
  const ml_up_down = () => {
    ml.value = withSequence(
      withTiming(ML_LEVELS[1], { duration: 2000, easing: Easing.bezier(0.55, 0.5, 0.45, 0.5) }),
      withTiming(ML_LEVELS[2], { duration: 2000, easing: Easing.ease })
    );
  };
  const animatedText = useAnimatedStyle(() => {
    return { text: Math.round(ml.value) };
  });
  return (
    <Animated.Text style={animatedText}></Animated.Text>
  );
}

简化 React Native 中的动画值解析

使用动画 反应本机,特别是在像这样的组件中 Animated.Text,需要正确处理输出值。虽然 React Native 的 Animated API 提供了广泛的动画功能,在某些情况下动画值会生成浮点数。在只需要完整数字的情况下(例如进度条或计数器),这些小数值可能会出现问题。为了克服这个问题,开发人员需要一些方法来转换或舍入动画数据,同时保持动画的平滑度。

一种选择是使用 interpolation 技术,它将动画值的输入范围映射到输出范围,使您可以控制动画值的显示方式。通过将输出范围与 toFixed(0),我们保证所呈现的价值 Animated.Text 始终是整数。这种组合保留了动画的完整性,同时确保用户友好且视觉准确的输出。

此外,使用诸如 Reanimated 在处理动画数据时提供更大的灵活性。 Reanimated 比 React Native 的内置 API 支持更高效、更具声明性的动画,使其成为复杂动画管理的理想选择。使用 shared values 和类似的功能 withTimingwithSequence 允许开发人员提高性能、最小化延迟并实现对动画及其输出的更精确控制。

有关在 React Native 中解析动画值的常见问题

  1. 将动画值转换为整数的最佳方法是什么?
  2. 理想的方法是使用 interpolate()toFixed(0) 将整数四舍五入到最接近的整数。
  3. 为什么会 Number.parseInt() 不支持动画值?
  4. 在 React Native 中,需要使用以下技术来更改动画值 interpolate() 而不是直接使用处理 Number.parseInt()
  5. Reanimated 用于处理动画中的整数值?
  6. 是的,与 Reanimated,你可以利用 useSharedValue()17 号 平滑地处理和显示整数值。
  7. 什么是 interpolate() 在这种情况下使用?
  8. interpolate() 将动画值映射到可配置的输出范围,允许将它们格式化为整数,同时保留动画。
  9. 使用 React Native 的性能有什么区别吗 Animated API 和 Reanimated
  10. 是的, Reanimated 由于优化的动画处理和共享数据,为复杂的动画提供了更高的性能。

在 React Native 中解析动画值的关键要点

在构建具有动态显示的用户界面时,将动画值转换为整数至关重要。使用类似的方法 插() 允许无缝转换,所显示的数字中没有分数。

使用 复活 库允许开发人员更有效地管理动画,从而提高性能和控制。选择适当的方法取决于动画的复杂性和所需的精度水平。

参考文献和来源
  1. 详细阐述了本文使用的示例,演示了 React Native 中的动画值解析。检查来源 解析动画值示例
  2. 提供有关 React Native Animated API 的信息,参考该 API 来解决动画问题。完整文档位于 React Native 动画 API
  3. Reanimated Library 的参考,它提供了处理复杂动画的替代解决方案。访问官方图书馆: 复活的文档