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.
144 lines
3.8 KiB
144 lines
3.8 KiB
2 months ago
|
# 音频与背景音乐交互功能说明
|
||
|
|
||
|
## Bug修复记录
|
||
|
|
||
|
### 问题描述
|
||
|
当音频播放时点击背景音乐按钮,背景音乐暂停音频并开始播放。此时再点击关闭背景音乐,图标显示关闭状态但背景音乐仍在播放。
|
||
|
|
||
|
### 问题原因
|
||
|
1. 点击背景音乐按钮时会发送事件暂停音频
|
||
|
2. 音频暂停时会调用restoreBackgroundMusic恢复背景音乐
|
||
|
3. 然后MusicControl再执行自己的切换逻辑
|
||
|
4. 导致背景音乐被恢复后又被操作,状态混乱
|
||
|
|
||
|
### 解决方案
|
||
|
1. **MusicControl组件优化**:
|
||
|
- 检测是否有音频在播放
|
||
|
- 如有音频,先暂停音频,延迟执行背景音乐切换
|
||
|
- 如无音频,直接切换背景音乐状态
|
||
|
|
||
|
2. **AudioControl组件优化**:
|
||
|
- 在handleBackgroundMusicToggle中只暂停音频
|
||
|
- 不自动恢复背景音乐,让MusicControl自己控制
|
||
|
|
||
|
### 修复后的交互流程
|
||
|
```mermaid
|
||
|
graph TD
|
||
|
A[点击背景音乐按钮] --> B{是否有音频播放?}
|
||
|
B -->|是| C[发送暂停音频事件]
|
||
|
C --> D[AudioControl暂停音频\n不恢复背景音乐]
|
||
|
D --> E[延迟100ms后切换背景音乐]
|
||
|
B -->|否| F[直接切换背景音乐状态]
|
||
|
```
|
||
|
|
||
|
## 实现的功能
|
||
|
|
||
|
### 🎵 **背景音乐控制音频**
|
||
|
当点击背景音乐控制按钮时:
|
||
|
- 如果有音频正在播放,会自动暂停音频
|
||
|
- 然后正常切换背景音乐的播放/暂停状态
|
||
|
|
||
|
### 🎧 **音频控制背景音乐**
|
||
|
当点击音频控制按钮时:
|
||
|
- 播放音频时自动暂停背景音乐
|
||
|
- 暂停音频时自动恢复背景音乐
|
||
|
- 音频播放结束时自动恢复背景音乐
|
||
|
|
||
|
## 技术实现
|
||
|
|
||
|
### 事件通信机制
|
||
|
使用uni-app的全局事件机制实现组件间通信:
|
||
|
|
||
|
```javascript
|
||
|
// AudioControl组件发送事件
|
||
|
uni.$emit('audioPlaying', true/false);
|
||
|
|
||
|
// MusicControl组件发送事件
|
||
|
uni.$emit('backgroundMusicToggle');
|
||
|
|
||
|
// 组件监听事件
|
||
|
uni.$on('eventName', this.handlerFunction);
|
||
|
```
|
||
|
|
||
|
### 交互流程
|
||
|
|
||
|
#### 点击背景音乐按钮:
|
||
|
```mermaid
|
||
|
graph TD
|
||
|
A[点击背景音乐按钮] --> B[发送backgroundMusicToggle事件]
|
||
|
B --> C[AudioControl收到事件]
|
||
|
C --> D{音频是否在播放?}
|
||
|
D -->|是| E[暂停音频]
|
||
|
D -->|否| F[继续背景音乐操作]
|
||
|
E --> G[恢复背景音乐]
|
||
|
F --> H[切换背景音乐状态]
|
||
|
```
|
||
|
|
||
|
#### 点击音频按钮:
|
||
|
```mermaid
|
||
|
graph TD
|
||
|
A[点击音频按钮] --> B{当前音频状态?}
|
||
|
B -->|未播放| C[暂停背景音乐]
|
||
|
C --> D[播放音频]
|
||
|
D --> E[发送audioPlaying:true事件]
|
||
|
B -->|正在播放| F[暂停音频]
|
||
|
F --> G[恢复背景音乐]
|
||
|
G --> H[发送audioPlaying:false事件]
|
||
|
```
|
||
|
|
||
|
## 使用方法
|
||
|
|
||
|
在页面中同时使用两个组件:
|
||
|
|
||
|
```vue
|
||
|
<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>
|
||
|
```
|
||
|
|
||
|
## 优势特点
|
||
|
|
||
|
### ✅ **智能交互**
|
||
|
- 两个组件能够智能感知对方的状态
|
||
|
- 避免同时播放音频和背景音乐造成的冲突
|
||
|
- 提供良好的用户体验
|
||
|
|
||
|
### ✅ **解耦设计**
|
||
|
- 组件间通过事件通信,保持松耦合
|
||
|
- 每个组件都能独立工作
|
||
|
- 易于维护和扩展
|
||
|
|
||
|
### ✅ **状态同步**
|
||
|
- 实时同步音频和背景音乐的播放状态
|
||
|
- 确保状态的一致性和准确性
|
||
|
|
||
|
## 注意事项
|
||
|
|
||
|
1. **事件监听清理**:组件销毁时会自动清理事件监听,避免内存泄漏
|
||
|
2. **状态管理**:两个组件都维护各自的状态,通过事件保持同步
|
||
|
3. **错误处理**:包含完善的错误处理机制,确保功能稳定运行
|