动手创造 · PROJECT LAB
准备探索你的新作品
声音库
0%
★★ 项目难度每一步,都离作品更近
先了解你将做出什么
应用介绍
把身边的声音收进手机:给录音起一个名字,下一次打开 App 还能找到它,点一下就能播放, 还可以选择循环播放。这个项目同时练习异步事件和本地持久化,是一个很完整的小应用。

声音库教程(难度系数:★★)
准备组件
| 组件类型 | 组件名称 | 关键设置 |
|---|---|---|
| 文本输入框 | 文本输入框_标题 |
输入声音标题 |
| 按钮 | 按钮_录音 |
开始录音 |
| 按钮 | 按钮_停止录音 |
停止录音 |
| 按钮 | 按钮_播放 |
播放选中声音 |
| 按钮 | 按钮_停止播放 |
停止播放 |
| 按钮 | 按钮_删除 |
删除选中声音 |
| 标签 | 标签_状态 |
显示操作状态 |
| 列表显示框 | 列表显示框_声音 |
显示声音标题 |
| 复选框 | 复选框_循环 |
文本:循环播放 |
| 录音机 | 录音机1 |
非可视组件 |
| 音频播放器 | 音频播放器1 |
非可视组件 |
| 微数据库 | 微数据库1 |
非可视组件 |
声音列表和当前选择
数据库的标签就是声音标题。先声明三个全局变量,并把更新列表的动作抽成过程;录音完成、删除声音 和 App 启动时都要刷新列表。
global 声音标题 = []
global 当前标题 = ""
global 当前声音 = ""
procedure 刷新声音列表() {
列表显示框_声音.Elements = 声音标题
}
when Screen1.Initialize() {
声音标题 = 微数据库1.GetTags()
刷新声音列表()
标签_状态.Text = join("已有 ", length(声音标题), " 个声音")
}
录音并保存
点“开始录音”只负责启动录音;真正得到文件路径要等 AfterSoundRecorded 事件。
如果没有标题就不要保存,否则下次无法从列表里找到这段录音。
when 按钮_录音.Click() {
录音机1.Start()
标签_状态.Text = "录音中……"
}
when 按钮_停止录音.Click() {
录音机1.Stop()
标签_状态.Text = "正在保存……"
}
when 录音机1.AfterSoundRecorded(sound) {
if isempty(文本输入框_标题.Text) {
标签_状态.Text = "录音完成,但请先输入标题"
} else {
微数据库1.StoreValue(文本输入框_标题.Text, sound)
if indexof(声音标题, 文本输入框_标题.Text) = 0 {
listadd(声音标题, 文本输入框_标题.Text)
}
刷新声音列表()
文本输入框_标题.Text = ""
标签_状态.Text = "已保存"
}
}
选择并播放声音
列表只保存标题,选中后再用标题去 微数据库 取出实际的文件路径。播放前检查路径,避免用户还没选声音
就点击播放按钮。
when 列表显示框_声音.AfterPicking(selection) {
当前标题 = selection
当前声音 = 微数据库1.GetValue(selection, "")
标签_状态.Text = join("已选:", selection)
}
when 按钮_播放.Click() {
if isempty(当前声音) {
标签_状态.Text = "先从列表选择一个声音"
} else {
音频播放器1.Loop = 复选框_循环.Checked
音频播放器1.Source = 当前声音
音频播放器1.Start()
标签_状态.Text = "播放中"
}
}
when 按钮_停止播放.Click() {
音频播放器1.Stop()
标签_状态.Text = "已停止"
}
删除声音
删除要同步做三件事:停止播放、删除数据库标签、删除列表里的标题。SelectionIndex 为 0 时表示
没有选择,先判断再删除,避免下标越界。
when 按钮_删除.Click() {
if 列表显示框_声音.SelectionIndex = 0 {
标签_状态.Text = "先选择要删除的声音"
} else {
音频播放器1.Stop()
微数据库1.ClearTag(当前标题)
listremove(声音标题, 列表显示框_声音.SelectionIndex)
当前标题 = ""
当前声音 = ""
列表显示框_声音.SelectionIndex = 0
刷新声音列表()
标签_状态.Text = "已删除"
}
}
开始测试
- 录一段短声音,输入标题后停止,列表里是否出现标题。
- 退出 App 再打开,刚才的声音是否仍然存在。
- 选中声音播放,勾选循环后是否会重复播放。
- 不选择声音直接点播放和删除,是否只显示提示。
- 删除后重新打开 App,声音是否真的不再出现。
剩余工作
可以增加录音时长、音量或分类标签;也可以把列表改成带图片的卡片。注意:微数据库 只保存在本机,
换手机不会自动同步声音文件。
边做边查
打开全部组件速查
卡在哪一步?直接查操作
不用退出当前教程。速查会在新页面打开,查完回来继续刚才的进度。