You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.8 KiB
3.8 KiB
音频与背景音乐交互功能说明
Bug修复记录
问题描述
当音频播放时点击背景音乐按钮,背景音乐暂停音频并开始播放。此时再点击关闭背景音乐,图标显示关闭状态但背景音乐仍在播放。
问题原因
- 点击背景音乐按钮时会发送事件暂停音频
- 音频暂停时会调用restoreBackgroundMusic恢复背景音乐
- 然后MusicControl再执行自己的切换逻辑
- 导致背景音乐被恢复后又被操作,状态混乱
解决方案
-
MusicControl组件优化:
- 检测是否有音频在播放
- 如有音频,先暂停音频,延迟执行背景音乐切换
- 如无音频,直接切换背景音乐状态
-
AudioControl组件优化:
- 在handleBackgroundMusicToggle中只暂停音频
- 不自动恢复背景音乐,让MusicControl自己控制
修复后的交互流程
graph TD
A[点击背景音乐按钮] --> B{是否有音频播放?}
B -->|是| C[发送暂停音频事件]
C --> D[AudioControl暂停音频\n不恢复背景音乐]
D --> E[延迟100ms后切换背景音乐]
B -->|否| F[直接切换背景音乐状态]
实现的功能
🎵 背景音乐控制音频
当点击背景音乐控制按钮时:
- 如果有音频正在播放,会自动暂停音频
- 然后正常切换背景音乐的播放/暂停状态
🎧 音频控制背景音乐
当点击音频控制按钮时:
- 播放音频时自动暂停背景音乐
- 暂停音频时自动恢复背景音乐
- 音频播放结束时自动恢复背景音乐
技术实现
事件通信机制
使用uni-app的全局事件机制实现组件间通信:
// AudioControl组件发送事件
uni.$emit('audioPlaying', true/false);
// MusicControl组件发送事件
uni.$emit('backgroundMusicToggle');
// 组件监听事件
uni.$on('eventName', this.handlerFunction);
交互流程
点击背景音乐按钮:
graph TD
A[点击背景音乐按钮] --> B[发送backgroundMusicToggle事件]
B --> C[AudioControl收到事件]
C --> D{音频是否在播放?}
D -->|是| E[暂停音频]
D -->|否| F[继续背景音乐操作]
E --> G[恢复背景音乐]
F --> H[切换背景音乐状态]
点击音频按钮:
graph TD
A[点击音频按钮] --> B{当前音频状态?}
B -->|未播放| C[暂停背景音乐]
C --> D[播放音频]
D --> E[发送audioPlaying:true事件]
B -->|正在播放| F[暂停音频]
F --> G[恢复背景音乐]
G --> H[发送audioPlaying:false事件]
使用方法
在页面中同时使用两个组件:
<template>
<view class="page-container">
<!-- 页面内容 -->
<!-- 音频控制组件 -->
<AudioControl :audioSrc="audioUrl" />
<!-- 背景音乐控制组件 -->
<MusicControl />
</view>
</template>
<script>
import AudioControl from '@/components/AudioControl.vue';
import MusicControl from '@/components/MusicControl.vue';
export default {
components: {
AudioControl,
MusicControl
},
data() {
return {
audioUrl: this.showImg('/uploads/audio/your-audio.mp3')
}
}
}
</script>
优势特点
✅ 智能交互
- 两个组件能够智能感知对方的状态
- 避免同时播放音频和背景音乐造成的冲突
- 提供良好的用户体验
✅ 解耦设计
- 组件间通过事件通信,保持松耦合
- 每个组件都能独立工作
- 易于维护和扩展
✅ 状态同步
- 实时同步音频和背景音乐的播放状态
- 确保状态的一致性和准确性
注意事项
- 事件监听清理:组件销毁时会自动清理事件监听,避免内存泄漏
- 状态管理:两个组件都维护各自的状态,通过事件保持同步
- 错误处理:包含完善的错误处理机制,确保功能稳定运行