📜  Android 中的 SoundPool 示例(1)

📅  最后修改于: 2023-12-03 15:29:21.580000             🧑  作者: Mango

Android 中的 SoundPool 示例

SoundPool 是一个轻量级的音频播放工具,专门用于播放短音频,比如游戏中的短音效,提示音,等等。在本文中,我们将介绍如何在 Android 应用程序中使用 SoundPool。

创建 SoundPool 实例

要使用 SoundPool,首先需要创建一个 SoundPool 实例。以下是创建实例的代码片段:

SoundPool soundPool = new SoundPool.Builder()
                .setMaxStreams(10) // 最大数量的音频流同时播放
                .setAudioAttributes(
                        new AudioAttributes.Builder()
                                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                                .setUsage(AudioAttributes.USAGE_GAME)
                                .build())
                .build();

在上面的代码中,我们指定了最大音频流数为 10。我们还设置了 audo attributes,以确定音频流的用途和内容类型。在这种情况下,我们设置用途为游戏,并设置内容类型为提示音。

加载音频文件

要播放音频,我们需要先将音频文件加载到 SoundPool 中。以下是如何加载音频文件的代码片段:

int soundId = soundPool.load(context, R.raw.sound_file, 1);

在上面的代码中,我们使用 load()R.raw 文件夹中加载一个名为 sound_file 的音频文件。我们还指定了优先级为 1。优先级是指在所有音频流都为满时,哪些音频流将停止播放。如果新音频文件的优先级高于其他某个播放中的音频流,则系统会停止该音频流,以让新音频流播放。如果所有音频流的优先级相等,则会停止最初播放的音频流。

播放音频文件

现在我们已经将音频文件加载到 SoundPool 中,可以播放了。以下是如何播放音频文件的代码片段:

soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
    @Override
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
        if (status == 0) {
            soundPool.play(sampleId, 1, 1, 1, 0, 1);
        }
    }
});

在上面的代码中,我们使用 setOnLoadCompleteListener() 监听音频文件的加载过程。在加载完成后,我们使用 play() 播放该文件。play() 方法接受多个参数:

  • sampleId:要播放的音频文件的 ID,可以通过 load() 方法返回的值获得。
  • leftVolumerightVolume:音量大小。这些值的范围是 0.0 到 1.0。
  • priority:优先级,用于确定在所有音频流都满载的情况下,哪些音频流将停止播放。较高的优先级意味着该音频流比其他较低优先级的音频流更重要。
  • loop:循环播放的次数。如果值为 0,则不循环播放。如果为 -1,则无限循环播放。
  • rate:播放速率。默认值是 1.0。值越高表示播放速度越快,值越低表示播放速度越慢。
停止音频文件

如果需要停止播放音频文件,可以使用以下代码:

soundPool.stop(soundId);

以上是 SoundPool 的基本用法。SoundPool 的另一个有用的特性是可以设置音频预加载。这意味着在需要播放音频之前,它已经被加载到内存中,这可以提高播放响应时间。使用 preload() 方法可以实现此功能。

soundPool.preload(context, R.raw.sound_file, 1);

在上面的代码中,我们使用 preload() 方法在后台预加载一个名为 sound_file 的音频文件。与 load() 方法不同,该方法不返回任何值,而是将音频文件放在内存中,以备需要时立即播放。

总之,SoundPool 是一个很有用的工具,特别是对于游戏程序开发。希望本文对您有所帮助。