将音效添加到您的React应用程序
在本文中,学习如何使用一个名为 uifx 的小型库在您的 React 应用程序中加入音效。
声音效果不经常用于应用程序。 您通常只会在 Big Tech 的应用程序上看到它们,例如:
- iOS 键盘发出木质敲击声
- Twitter iOS 应用程序在您拉动刷新时会发出“砰”的一声
- 当您调用他们的名字时,“Hey Google”和“Hey Siri”具有独特的记忆音调
我认为我们已经习惯了这些“噪音”,以至于它们甚至不再被认为是有趣的功能。 但他们是! 想象一下,如果苹果突然决定从他们的键盘上删除“滴答声”。 对于我们这些已经习惯了那种熟悉的噪音的人来说,我们可能会感到某种奇怪的听觉剥夺。 然而,对于网络应用程序,我们几乎从未在用户界面中看到内置音效 (sfx),坦率地说……我们几乎不希望它们存在。
iOS/Android 应用程序并不是唯一可以用声音表达自己的数字媒体。 网络可以……而且应该更多地包含声音效果!
介绍 UIfx
我意识到有很多成熟的音频库,例如 SoundManager 或 Howler,但它们都不是为 UI 音效而设计的,需要即发即弃的播放策略迷你声音片段……所以我为此构建了一个简单的库,称为 uifx:
import UIfx from 'uifx';
import mp3File from './my-sounds/beep.mp3';
const beep = new UIFx({asset: mp3File});
<button onClick={beep.play}>Signup</button>
这里使用了 React,但您可以在任何具有 Audio API 的 JavaScript 环境中使用它——这是最现代的浏览器!
基本用法
这是一个实际示例,其中 sound fx 用于在 <input type="range"/> 元素上提供音频反馈。
import React, { Component } from 'react';
import UIfx from 'uifx';
import tickAudio from './my-sounds/tick.mp3';
const tick = new UIfx({asset: tickAudio});
export default class InputRange extends Component {
state = {
value: 0,
}
onChange = (event) => {
this.setState({ value: event.target.value });
tick.play();
}
render() {
return (
<div>
<div>{this.state.value}</div>
<input
type="range"
value={this.state.value}
onChange={this.onChange}
/>
</div>
)
}
}
你不知道制表师的工具之类的吗? 这有多有趣?! 音频增加了全新的感官体验!
节流播放
UIfx 专为快速连续播放微小的音频文件而设计。 但是,有时您会想要稍微限制播放,以免听起来太疯狂或让用户的扬声器过载:
const tick = new UIfx({
asset: tickAudio,
throttleMs: 40
})
找到实时反馈的正确平衡更像是一门艺术,而不是一门科学。 我通常尝试设身处地为用户着想,问自己想要多少即时音频反馈,并相应地进行节流。
更改播放音量
默认情况下,声音会以最大音量播放。 要更改 UIfx 声音的音量,请调用 UIfx.setVolume() 方法:
beep.setVolume(0.8).play(); // or... beep.setVolume(0.8); beep.play();
有效参数是 0.0 → 1.0 以模拟 Audio api。 在下面的演示中,使用之前的 <input type="range"> 滑块更改了音量:
class ToastNotifications extends Component {
state = {
isToastVisible: false,
volume: 0.5,
}
sfx = {
beep: new UIfx({asset: beepAudio}),
tick: new UIfx({asset: tickAudio, throttleMs: 100}),
appear: new UIfx({asset: appearAudio}),
disappear: new UIfx({asset: disappearAudio})
}
onVolumeChange = (event) => {
this.setState(
{ volume: event.target.value },
// "setState" cb to get updated volume 👇
() => this.sfx.tick.setVolume(this.state.volume).play()
)
}
toggleToast = () => {
this.setState(
{ isToastVisible: !this.state.isToastVisible },
() => {
this.state.isToastVisible // 👈 decide which sfx to play
? this.sfx.appear.setVolume(this.state.volume).play()
: this.sfx.disappear.setVolume(this.state.volume).play()
}
)
}
render() {
return (
<div>
<button onClick={this.toggleToast}>
Toggle notification
</button>
<div>
Volume: {this.state.volume}
</div>
<input
value={this.state.volume}
onChange={this.onVolumeChange}
min="0.0"
max="1.0"
step="0.01"
type="range"
/>
<Toast isVisible={this.state.isToastVisible}/>
</div>
)
}
}
如果您不想保留音量变化,您可以通过将参数传递给 UIfx.play() 轻松地以不同的音量播放:
const tick = new UIfx({
asset: tickMp3,
volume: 1.0
});
tick.play(0.25); // plays at 0.25 volume
tick.play(); // plays at 1.0 volume
结论
Web 应用程序中的音效是一个相对未开发的领域。 我希望 uifx 将帮助您构建更充分地吸引人们的应用程序——包括视觉和听觉。 像这样的小触动可以触动人心,为你的用户提供更丰富的体验。
📦 看看[uifx](https://github.com/wle8300/uifx)! 我很想知道你的想法!