React Native Expo 项目中添加动画音效

背景

最近做一个学校作业,用 React Native 写一个游戏。游戏中涉及一个物体下落的动效,是用 React Native 的 Animated API 实现的。

现在希望在物体落地的时候发出“嗒”的一个音效,没想到还挺麻烦。

首先需要一个库来实现音频的播放。网上搜了一下,大部分人的解决方案都是用 react-native-sound 这个库。我照着试了一下,安装很麻烦不说,即便我只是像下面这样引入这个库:

import Sound from 'react-native-sound';

也会一直报这个错误:

TypeError: null is not an object (evaluating 'RNSound.IsAndroid')
at node_modules/react-native/Libraries/Core/ExceptionsManager.js:104:6 in reportException
at node_modules/react-native/Libraries/Core/ExceptionsManager.js:172:19 in handleException
at node_modules/react-native/Libraries/Core/setUpErrorHandling.js:24:6 in handleError
at node_modules/@react-native/polyfills/error-guard.js:49:36 in ErrorUtils.reportFatalError
at node_modules/metro-runtime/src/polyfills/require.js:204:6 in guardedLoadModule
at http://192.168.1.5:19000/node_modules/expo/AppEntry.bundle?platform=android&dev=true&hot=false&minify=false:488211:3 in global code

后来突然想到,我这个项目是基于 Expo 的,如果 Expo 提供了音频解决方案就好了。搜了一下还真有!

后来又捣鼓了一阵,终于实现了。

实现

代码

示例代码如下:

import { useRef, useEffect } from 'react';
import { Animated, Dimensions, Easing } from 'react-native';
import { Audio } from 'expo-av'; // 引入该库

const WINDOW_WIDTH = Dimensions.get('window').width;
const WINDOW_HEIGHT = Dimensions.get('window').height;
const BOX_SIZE = WINDOW_WIDTH / 5;
const BOX_INIT_X = WINDOW_WIDTH/2 - BOX_SIZE/2;
const BOX_INIT_Y = WINDOW_WIDTH/2;
const BOX_FINAL_Y = WINDOW_HEIGHT - BOX_SIZE

let crashSound; // 音效

export default function App() {
  const positionY = useRef(new Animated.Value(BOX_INIT_Y)).current

  // 加载音效
  useEffect(async () => {
    const { sound } = await Audio.Sound.createAsync(
      require('./crash_sound.m4a')
    );

    crashSound = sound;
  }, [])
  
  // 设置动画
  useEffect(() => {
    Animated.timing(
      positionY,
      {
        toValue: BOX_FINAL_Y,
        duration: 1000,
        useNativeDriver: false,
        easing: Easing.ease
      }
    ).start(() => {
      // 这个是动效的回调函数,会在动效结束之后被调用,然后播放音效
      // 注意用 replayAsync 而不是 playAsync
      crashSound.replayAsync();
    });
  }, [])

  const boxStyle = {
    position: 'absolute',
    top: positionY,
    left: BOX_INIT_X,
    width: BOX_SIZE,
    height: BOX_SIZE,
    backgroundColor: 'red'
  }
  return <Animated.View style={boxStyle} />
}

注意,使用 replayAsync 而不是 playAsync,是因为 playAsync 只能播一次,第二次调用就没声音了;而 replayAsync 每次调用都有声音。

效果

示例视频

参考链接

Expo - Playing sounds
React Native 中使用 Animated 实现物体下落动效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您的React Native项目是原生的,而不是使用Expo构建的话,那么在将TensorFlow Lite集成到项目时,需要执行以下步骤: 1. 安装TensorFlow Lite:您可以使用以下命令在React Native项目安装TensorFlow Lite: ``` npm install @tensorflow/tfjs @tensorflow/tfjs-react-native @tensorflow/tfjs-react-native@0.2.1 ``` 2. 在iOS项目添加TensorFlow Lite库:在iOS项目,您需要将TensorFlow Lite库添加项目。您可以使用以下命令从CocoaPods安装TensorFlow Lite: ``` cd ios && pod install ``` 3. 将TensorFlow Lite模型添加项目:将TensorFlow Lite模型文件(.tflite)复制到React Native项目的assets文件夹。 4. 在React Native应用程序加载TensorFlow Lite模型:您可以使用以下代码加载TensorFlow Lite模型: ```javascript import { load } from "@tensorflow/tfjs-react-native"; async function loadModel() { const modelJson = require("./assets/model.json"); const modelWeights = require("./assets/model_weights.bin"); const model = await load({ modelUrl: modelJson, weightsUrl: modelWeights, }); return model; } ``` 此代码将加载您的TensorFlow Lite模型文件(model.json和model_weights.bin)并返回一个TensorFlow模型对象。 5. 使用TensorFlow Lite模型进行推理:您可以使用以下代码将输入数据传递给TensorFlow Lite模型进行推理: ```javascript const inputTensor = tf.tensor2d([inputData]); // inputData是您的输入数据 const outputTensor = model.predict(inputTensor); const outputData = outputTensor.dataSync(); outputTensor.dispose(); ``` 此代码将创建一个输入张量对象,将其传递给TensorFlow Lite模型进行推理,并返回一个输出张量对象。然后,您可以使用outputTensor.dataSync()方法从输出张量对象提取结果。 以上是将TensorFlow Lite集成到React Native原生项目的基本步骤。请注意,步骤2和步骤3在Android项目可能会略有不同。在Android项目,您需要将TensorFlow Lite库添加到Gradle构建文件,并将模型文件复制到assets文件夹
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值