2025-05-24

即時音效,顧名思義,是一個又短又快的音效,適合於播放時間較短反應迅速的音頻文件,例如輸入法打字時的“噠噠”聲就是這個東西,下象棋時的下棋聲也是…
該技術繼承自android.media.SoundPool
SoundPool類用於和播放應用程序的聲音資源,該類將聲音文件加載到內存中,處於性能的考慮,一般隻將時間小於7秒左右的聲音文件用該技術播放。
構造方法SoundPool(int maxStreams, int streamType, int srcQuality)
• maxStreams:該參數用於設置同時能夠播放多少音效,如設置為3,則最多同時可以播放3個音效
• streamType:音頻類型,在遊戲中通常設置為STREAM_MUSIC
• srcQuality:音頻文件的質量,默認設置為0
加載音頻文件public int load(Context context, int resId, int priority)
• context:應用程序上下文,即調用它的Activity
• resId:資源id
• priority:優先級,可以設置為1
播放音效public final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
• soundID:播放的音樂ID
• leftVolume:用來控制左聲道音量
• rightVolume:用來控制右聲道音量
• priority:優先級,0最低
• loop:循環次數,0為不循環,-1為永遠循環
• rate:回放速度,該值在0.5-2.0之間,1為正常速度
暫定播放public final void pause(int streamID)
• streamID音效ID
 
下面是應用這個即時音效的一個例子

package com.loulijun.quicksound;
 
import java.util.HashMap;
 
import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
 
public class QuickSoundActivity extends Activity {
    //創建一個聲音池
    private SoundPool sp;
    HashMap<Integer, Integer> map;
    private Button startOne = null;
    private Button stopOne = null;
    private Button startTwo = null;
    private Button stopTwo = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //初始化聲音池
        initSoundPool();
        startOne = (Button)findViewById(R.id.startone);
        stopOne = (Button)findViewById(R.id.stopone);
        startTwo = (Button)findViewById(R.id.starttwo);
        stopTwo = (Button)findViewById(R.id.stoptwo);
         
        startOne.setOnClickListener(new Button.OnClickListener()
        {
 
            @Override
            public void onClick(View v) {
                playSound(1,1);//播放第一首音效,循環一遍
            }
             
        });
        stopOne.setOnClickListener(new Button.OnClickListener()
        {
 
            @Override
            public void onClick(View v) {
                //暫停第一首音效www.aiwalls.com
                sp.pause(map.get(1));
            }
             
        });
        startTwo.setOnClickListener(new Button.OnClickListener()
        {
 
            @Override
            public void onClick(View v) {
                //播放第二首音效,循環兩次
                playSound(2,2);
            }
             
        });
        stopTwo.setOnClickListener(new Button.OnClickListener()
        {
 
            @Override
            public void onClick(View v) {
                //暫定第二首音效
                sp.pause(map.get(2));
            }
             
        });
    }
    //聲音池初始化方法
    private void initSoundPool()
    {
        sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        map = new HashMap<Integer, Integer>();
        map.put(1, sp.load(this, R.raw.one, 1));
        map.put(2, sp.load(this, R.raw.two, 1));
    }
    //播放聲音方法
    public void playSound(int sound, int number)
    {
        AudioManager am = (AudioManager)this.getSystemService(this.AUDIO_SERVICE);
        //返回當前AlarmManager最大音量
        float audioMaxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        //返回當前AudioManager對象的音量值
        float audioCurrentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
        float volumnRatio = audioCurrentVolume/audioMaxVolume;
        sp.play(
                map.get(sound), //播放的音樂Id 
                volumnRatio, //左聲道音量
                volumnRatio, //右聲道音量
                1, //優先級,0為最低
                number, //循環次數,0無不循環,-1無永遠循環
                1);//回放速度,值在0.5-2.0之間,1為正常速度
    }
}

  

作者  婁立軍
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *