美文网首页Android
Android开发(44) 使用了 SoundPool 播放提

Android开发(44) 使用了 SoundPool 播放提

作者: 张云飞Vir | 来源:发表于2016-06-23 11:20 被阅读3180次

    概述 SoundPool

    一个声音播放的辅助类,从名字可以看出,它具有 “池”的能力(缓存),它先加载声音文件到内存,以支持多次播放声音文件。

    特点

    • SoundPool适合 短小的 声音文件
    • SoundPool适合播放 “需要多次播放的提示音”,比如在 一些常用的 请登录,请点击什么的
    • 相比mediaPlayer,耗用资源更少
    • 支持 同时 播放多个声音

    使用方法

    创建实例

        mSoundPool = new SoundPool(1, AudioManager.STREAM_ALARM, 0);
        soundPoolMap = new HashMap<Integer, Integer>(); //这里我创建一个 hash 表,用于记录加载过的声音的ID,一般我们会定义一个常量作为检索该声音的KEY
    

    加载声音文件

        soundPoolMap.put(KEY_SOUND_A1, mSoundPool.load(this, R.raw.a1, 1));
            soundPoolMap.put(KEY_SOUND_A2, mSoundPool.load(this, R.raw.a2, 1));//注意,这里 hash表里 记录
    

    播放声音文件

        mSoundPool.play(soundPoolMap.get(KEY_SOUND_A1), 1, 1, 0, 0, 1); //注意,这里从hash表里取出了具体的ID
    

    注册一个监听器,在加载声音完毕的时候获得消息

        mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
                    @Override
                    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                        alert(" " + sampleId);
                    }
                });
    

    代码

    下面是完整的类的代码

    package demo.vir56k.soundpooldemo;
    
    import android.media.AudioManager;
    import android.media.SoundPool;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    
    import java.util.HashMap;
    
    public class MainActivity extends AppCompatActivity {
        public static final int KEY_SOUND_A1 = 1;
        public static final int KEY_SOUND_A2 = 1;
    
        SoundPool mSoundPool;
        private HashMap<Integer, Integer> soundPoolMap;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mSoundPool = new SoundPool(1, AudioManager.STREAM_ALARM, 0);
            mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
                @Override
                public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                    alert(" " + sampleId);
                }
            });
            soundPoolMap = new HashMap<Integer, Integer>();
            soundPoolMap.put(KEY_SOUND_A1, mSoundPool.load(this, R.raw.a1, 1));
            soundPoolMap.put(KEY_SOUND_A2, mSoundPool.load(this, R.raw.a2, 1));
        }
    
        private void alert(String s) {
            Log.i("Alert: ", s + "");
        }
    
        public void onClickView(View view) {
            if (view.getId() == R.id.button) {
                mSoundPool.play(soundPoolMap.get(KEY_SOUND_A1), 1, 1, 0, 0, 1);
            }
            if (view.getId() == R.id.button2) {
                mSoundPool.play(soundPoolMap.get(KEY_SOUND_A2), 1, 1, 0, 0, 1);
            }
        }
    
    }
    

    下载:https://github.com/vir56k/demo/tree/master/SoundPoolDemo

    相关文章

      网友评论

        本文标题:Android开发(44) 使用了 SoundPool 播放提

        本文链接:https://www.haomeiwen.com/subject/mkundttx.html