android soundpool 封装,Android 音效 SoundPool 封装类 停止音效播放

article/2025/10/5 22:23:35

项目中,需要添加点击或者状态回调的音效。

Android 有专门用于实现音效播放的类,就是 SoundPool 。

1 工具类封装

共四种音效,更多可在 init 中 自行添加。

/**

*

 

* author : jake

* time : 2019/01/10

* function : 音效管理类

* version: 1.3.0

*

*/

class SoundPoolManager {

companion object {

private var instance: SoundPoolManager? = null

get() {

if (field == null) {

field = SoundPoolManager()

}

return field

}

@Synchronized

fun get(): SoundPoolManager {

return instance!!

}

const val TASK_CLICK = 1

const val TASK_SUCCESS = 2

const val TASK_WRONG = 3

const val TASK_REWARD = 4

}

private var soundPool: SoundPool = SoundPool(4, AudioManager.STREAM_MUSIC, 0)

private var sourcesMap = HashMap()

init {

sourcesMap[TASK_CLICK] = soundPool.load(RiseApp.mContext, R.raw.click, 1)

sourcesMap[TASK_SUCCESS] = soundPool.load(RiseApp.mContext, R.raw.success, 1)

sourcesMap[TASK_WRONG] = soundPool.load(RiseApp.mContext, R.raw.wrong, 1)

sourcesMap[TASK_REWARD] = soundPool.load(RiseApp.mContext, R.raw.reward, 1)

}

fun play(type: Int) {

// 防止type不存在

if (sourcesMap[type] != null) {

soundPool.play(sourcesMap[type]!!, 1.0f, 1.0f, 0, 0, 1.0f)

}

}

}

在触发的地方,直接使用即可

SoundPoolManager.get().play(SoundPoolManager.TASK_CLICK)

2 音效停止播放(2019.4.23)

头一次遇到还要音效播一半,还要停止的。(音效比较多,且比较长,多次点击重复混合播放)

按照经验,肯定是通过 url 来判断是停止播放,还是开始播放新音效(两次传入相同则停止,否则则播放新的),然而发现并不生效。

后来想到,因为是一个 音效对象池,是不是播放第一个音效和播放第二个音效用不是同一个对象,从而导致调用停止方法无效的?

就是这个原因

当我们调用下面方法播放音效时,其返回值就是当前播放音效的 对象ID,且每次都不一样

soundPool.play(sourcesMap[path]!!, 1.0f, 1.0f, 0, 0, 1.0f)

所以我们只需要存储一下,上一次播放音效时的 对象ID ,然后在调用 stop 方法时,传入 对象ID 即可停止播放音效。

存储上次播放时的 音效对象ID

lastSound = soundPool.play(sourcesMap[path]!!, 1.0f, 1.0f, 0, 0, 1.0f)

停止时传入

soundPool.stop(lastSound)

由于,后来项目中用的不是打在APK 中的本地音效,而是下载到设备特定目录的音频文件,还有一些其他对应关系,故又重新封装了新的工具类,如下:

/**

*

 

* author : jake

* time : 2019/03/10

* function : 音效管理类

* version: 1.0

*

*

* 根据下载到本地的音效路径,播放音效

*

* 在音效下载完毕后,会调用初始化方法 LibrarySoundsManager

*

*/

class LibrarySoundPoolManager {

companion object {

private var instance: LibrarySoundPoolManager? = null

get() {

if (field == null) {

field = LibrarySoundPoolManager()

}

return field

}

@Synchronized

fun get(): LibrarySoundPoolManager {

return instance!!

}

private var soundPool: SoundPool = SoundPool(37, AudioManager.STREAM_MUSIC, 0)

private var sourcesMap = HashMap()

private var lastSound = 0

}

/**

* 预加载 图书馆音效资源

*

* 调用此方法时,证明图书馆音效资源已经下载完毕

*/

fun init(content: String) {

/**

* 获取前端数据,并解析

*/

val json = JSONObject(content)

val path = json["path"].toString()

val data = path.split("^")

if (data != null && data.size > 0) {

for (item in data) {

if (!item.isEmpty() && sourcesMap[RiseWebPath.LibraryWebKey.plus("/sounds/").plus(item)] == null) {

sourcesMap[RiseWebPath.LibraryWebKey.plus("/sounds/").plus(item)] = soundPool.load("${RisePath.libraryDir}/sounds/$item", 1)

}

}

}

}

/**

* 根据下载到本地的音效路径,播放音效

*/

fun play(path: String) {

if (!path.isEmpty() && sourcesMap[path] != null) {

soundPool.stop(lastSound)

lastSound = soundPool.play(sourcesMap[path]!!, 1.0f, 1.0f, 0, 0, 1.0f)

}

}

/**

* 停止播放所有音效

*/

fun stop() {

soundPool.stop(lastSound)

}

}

8a6c415118db

うずまき ナルト


http://chatgpt.dhexx.cn/article/aOvnCwwW.shtml

相关文章

SoundPool

SoundPool 一、SoundPool简介 MediaPlayer虽然也能播放音频,但是它有资源占用量较高、延迟时间较长、不支持多个音频同时播放等缺点。这些缺点决定了MediaPlayer在某些场合的使用情况不会很理想,例如在对时间精准度要求相对较高的场景。而SoundPool一般…

Android学习笔记 50. Android 多媒体技术——SoundPool播放音效

Android学习笔记 Android 多媒体技术 文章目录 Android学习笔记Android 多媒体技术50. Android 多媒体技术——SoundPool播放音效50.1 SoundPool50.2 使用SoundPool 50. Android 多媒体技术——SoundPool播放音效 50.1 SoundPool MediaPlayer虽然也能播放音频,但…

Android多媒体功能开发(7)——使用SoundPool类播放音频

使用SoundPool的基本流程是:创建一个SoundPool对象、载入要播放的音频、播放某个音频、停止播放某个音频。 一个SoundPool对象可以载入多个音频,每个音频载入后对应一个SoundID。播放某个音频时用SoundID指定要播放的音频,并返回播放该音频的…

【Android -- 音效】使用 SoundPool 播放音效

前言 SoundPool 一般用来 播放密集,急促而又短暂的音效,比如特技音效:Duang~,游戏用得较多,你也可以为你的 APP 添加上这个音效,比如酷狗音乐进去的时候播放"哈喽,酷狗",…

SoundPool播放音效

强调!!!以下只是我个人看法,如有错误的地方请文明指出,如有其他看法请耐心讨论,如有看不懂可以参考其他有关博客,最后如有想喷的出门左转不谢。 上次有提到用MediaPlayer来播放音频&…

Vscode编译调试C++程序

一、简介 本文讲述在windows平台下在Vscode中使用g编译本地C程序,并使用gdb调试的方法。可能有些朋友会说:windows上不是已经有visual studio这个最强IDE了吗,为什么还要用Vscode调试?是的,确实没错,单纯用…

vscode使用visual studio编译工具MSVC构建C++工程

准备工作 vscode软件visual studio软件 添加头文件到配置中 因为要使用到win10的开发工具包,因此必须让其找到其头文件 ctrlshiftp打开命令搜索,输入c json 然后打开配置文件,加入路径 其中一个是msvc的工具包,还有一个是win1…

vs code编译器的使用

1.插件的安装 在vs code左侧可以看到有拓展,然后可以搜索你想要的插件,如图所示: 2.插件列表 名称 简述 Auto Close Tag 自动闭合HTML标签 Auto Import Typescript自动import提示 Auto Rename Tag 修改HTML标签时,自动修改匹…

vs编译器教程

本次主要介绍的是如何使用visual studio 2019编译c语言代码。 安装好vs 2019后,打开进入到此界面 此时我们点击创建新项目进入到 再点击第一个选项:空项目,进入下一步 对所创建的项目进行命名,位置尽量不要放在C盘。然后下一步 此…

在vs里配置其他编译器

我们都知道vs是微软旗下的集成开发环境,我们用它来写c也是非常好的,不过因为各种原因,可能各位需要其他编译器但是又不想换ide。 其实vs可以安装任何编译器,我们今天介绍简单的安装clang编译器 首先我们需要找到vs所在文件夹 我们…

VSCode 的C++编译

0. 参考文档 0.1. 官方参考 由于C在不同平台上编译使用的编译器不同,所以我们先将官网针对不同平台的编译文档摘录出来,以便大家参考: 0.0.1. Linux平台使用GCC 参考: https://code.visualstudio.com/docs/cpp/config-linux …

关于vs编译器的一些认识

.vcproject 后缀 是一个项目里面的一个单独的子解决方案,相当于一个小模块 .sln 后缀 是整个项目的启动点 菜单里面的生成:相当于linux的编译 如图所示 输出目录 :就是生成(编译)后的 exe文件或者 dll文件,lib文件所在的目录 目标文件名:就是编译后的文件名字 目标文件…

C语言编辑器的使用(VS)

选择编辑器 编辑器介绍VS的使用 编辑器介绍 1,什么是编辑器(即开发环境) 所谓的开发环境就是指一个基本硬件和宿主软件的基础上,为支持系统软件和应用软件的工程化开发,维护而使用的一组软件。 2,Visual S…

Visual Studio Code编译运行C/C++程序

参考网站:https://www.cnblogs.com/TAMING/p/8560253.html 使用code runner 插件 code runner插件默认的c/c编译器是gcc/g,需要提前安装好并且设置好环境变量,通常选择MinGW或者MinGW-w64,建议选mingw-w64 安装好并且设置好二者中的一个,并…

vs code如何编译C语言?

vs code 编译C/C语言 C/C语言 文章目录 vs code 编译C/C语言安装 Vs Code安装 C/C扩展安装 Mingw-w64配置环境变量检查 Min GW是否安装成功使用Hello World如何编译多个c文件代码?如何修改默认编译文件名?如何编译 .o 文件?如何输出.txt文件&#xff1f…

VS Code编译C/C++

C/C环境的配置要比python的复杂许多,好几个配置文件要写。 一、编译C/C的环境一般都是集成在我们的编辑器中的,如果电脑上有codeblock和dev c的读者可以去安装路径下找找MinGW文件夹,可以不用重复下载。而没有的读者则需要下载MinGW 二、配置…

使用VS Code 编译运行C/C++程序

文章目录 安装C/C编译器验证C/C开发环境安装插件 创建C文件运行C文件 调试创建tasks.json文件构建C文件创建launch.json文件调试C文件 总结 安装C/C编译器 macOS与主流的发行版Linux系统都自带了C/C编译器(gcc和g),而对于Windows,我们需要通过Mingw-w64…

【C++】各版本标准与gcc、vs编译器对应关系

c常用的编译场景一般是linux或windows,linux通常使用Mingw中的gcc/g编译器,Windows通常使用visual studio IDE中的微软编译器,随着c11及以上标准的普及,再编译器遇到这些新特性的时候,如果编译器版本过低,那…

Visual Studio Code(VSCode) 编辑/编译/调试 C++ 代码

前言 最近想要切换编辑工具,之前工作中使用过 Source Insight,Eclipse,CLion 来写 C 代码。目前来说 Source Insight 已经非常古老,只有编写代码还说得过去,编译、调试方面都不行。Eclipse 使用的时间最长,…

你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧

你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧😎 前言🙌1. 什么是bug?🙌2. 调试是什么?有多重要?🙌2.1 调试是什么?2.2 调试的基本步骤…