目录

  • 背景
  • 实现
    • 代码
    • 效果
  • 参考链接

背景

最近做一个学校作业,用 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_SIZElet 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 而不是 playAsynccrashSound.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 实现物体下落动效

React Native Expo 项目中添加动画音效相关推荐

  1. 如何在React Native和Firebase中设置Google登录

    Google sign-in is a great login feature to offer to your app's users. It makes it easier for them to ...

  2. React Native填坑之旅--动画篇

    React Native填坑之旅--Button篇 React Native填坑之旅--动画 React Native填坑之旅--HTTP请求篇 动画是提高用户体验不可缺少的一个元素.恰如其分的动画可 ...

  3. VB.NET 在项目中添加App.config的配置

    右击项目,选择属性, 在属性中选择Settings选项卡,Scope选择User 这样就会在项目中添加了App.config配置 内容: <?xml version="1.0" ...

  4. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序 2 ...

  5. 关于如何正确地在android项目中添加第三方jar包

                  在android项目中添加第三方jar包虽然不是一个很复杂的问题,但是确实给很多开发者带来了不小的困扰.我自己就曾经碰到过calss not found exception ...

  6. [react] 有在项目中使用过Antd吗?说说它的好处

    [react] 有在项目中使用过Antd吗?说说它的好处 They gave every user a big surprise on Christmas Holiday. 个人简介 我是歌谣,欢迎和 ...

  7. 给iOS项目中添加图片,并通过UIImageView引用和显示该UIImage图片

    [问题] 关于iOS/iPhone中的文件选择对话框,用于用户去选择图片等文件 过程中,问题转换为,需要给当前iOS项目中,添加一个图片. 类似于Windows开发中的资源文件,其中图片文件属于资源的 ...

  8. Resx 文件无效。未能加载 .RESX 文件中使用的类型 System.Collections.Generic.List`1请确保已在项目中添加了必需的引用。

    在C#程序编写过程中,会遇到:Resx 文件无效.未能加载 .RESX 文件中使用的类型 System.Collections.Generic.List1`请确保已在项目中添加了必需的引用. 主要原因 ...

  9. 圣诞节PNG免扣素材|轻松向现有项目中添加节日元素!

    制作任何东西,从定制的圣诞卡,图标,可以用于网站设计或包装,甚至图形,照片和插图,PNG免扣格式图片素材,无疑可以帮助你有效的完成项目. 节日的装饰不仅仅包括挂一棵圣诞树和添加金属箔.装饰也可以延伸到 ...

最新文章

  1. [转]ASP.NET中常用输出JS脚本的类
  2. Ajax[Mount]
  3. LeetCode Gray Code(回溯法)
  4. java引用类型和值类型_[Java教程]JavaScript中值类型和引用类型的区别
  5. shujufenxi : baichi xiangzhuanqian
  6. 鸿蒙45000,华为发布鸿蒙系统沟通口径通知 网友表示支持国货
  7. 关于js的回调函数的一点看法
  8. 开源推荐:.Net Core3.1 + EF Core + LayUI 封装的MVC版后台管理系统
  9. 求字符串全排列的递归算法
  10. 华为oj题目c语言,华为OJ机试题目——24点游戏算法
  11. 美国国家安全局是如何入侵你的电脑的?
  12. python交互式绘图比较_python – 基于Tkinter和matplotlib的交互式绘图
  13. webpack对模块查找的优化
  14. My安卓知识6--关于把项目从androidstudio工程转成eclipse工程并导成jar包
  15. 《圈圈教你玩USB》 第三章 USB鼠标的实现——看书笔记( 3 )
  16. 中国橡胶防老剂4020市场现状与投资预测报告(2022版)
  17. 身份证文字信息及人脸图片采集
  18. adb shell 获取手机分辨率
  19. c语言中有自己的bool类型
  20. HDU4801 转魔方、DFS模拟

热门文章

  1. Keystone详解
  2. 如何使用 ChatGPT (人工智能聊天机器人) 运行 Docker 容器
  3. Python基础语法函数——顺序与选择结构
  4. MOOG穆格伺服阀D661-4444C G60JOAA6VSX2HA
  5. NUC970(ARM9)裸机SPI驱动
  6. K-Prototypes聚类的Python实现
  7. Java web 课程设计——图书馆管理系统(SSM)
  8. code128条码生成与显示
  9. Java Date Time 教程-java.sql.Date
  10. 获取系统中已经安装的文字输入法