android 游戲開發之即時音效Demo


MediaPlayer與即時音效

在android游戲開發中,有一些需要一點就播放音樂的需求,比如在飛車中的加速聲音、下旗的滴滴聲等,這些很短快速的就需要使用Android的即時音效。如果用MediaPlayer會占用大量的系統資源,而且播放的時候還需要緩沖,有較大的時延,因此即時音效就能補充它的不足。

即時音效的主要類

 

public SoundPool (int maxStreams, int streamType, int srcQuality)

Since:  API Level 1

創建SoundPool對象

Parameters
maxStreams 設置最多同時播放的音效個數
streamType 設置音頻的類型,一般設置為 STREAM_MUSIC.
srcQuality 默認為0,現在還什么作用
Returns
  • 返回一個SoundPool對象,如果創建失敗返回null

 

public int load (Context context, int resId, int priority)

Since:  API Level 1

重APK resource中加載音效文件. 例如,如果你想加載一個raw文件下的explosion.mp3,你在代碼中調用R.raw.explosion這個資源ID. 注意這個文件中不能有兩個同名的文件,如

explosion.wav和explosion.mp3。這樣可能會加載錯誤。沒測試過。

Parameters
context 上下文
resId 要加載的音效文件ID
priority 優先級,設為1即可
Returns

返回資源ID,這個值可以加用來播放與停止音效文件。

 

public final void pause (int streamID)

Since:  API Level 1

暫停播放的音效

Parameters
streamID 上一個函數返回的ID號

 

public final void stop (int streamID)

Since:  API Level 1

停止播放的聲音

Parameters
streamID 用Play返回的當前ID

 

一個案例:

package com.example.soundpool;


import java.util.HashMap;

import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    private Button play;
    private Button stop;
    private SoundPool sp;
    private float volume;
    private int currentID;
    private HashMap<Integer, Integer> hm;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        play=(Button)findViewById(R.id.play);
        stop=(Button)findViewById(R.id.stop);
       
        initSoundPool();
        play.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                playSound(1,0);
                Toast.makeText(getApplicationContext(), "播放即時音效!", Toast.LENGTH_SHORT).show();
                
            }

            
        });
        stop.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                sp.stop(currentID);
                Toast.makeText(getApplicationContext(), "停止即時音效!", Toast.LENGTH_SHORT).show();
                
            }
        });
    }

    private void initSoundPool() {
        sp=new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
        hm =new HashMap<Integer, Integer>();
        hm.put(1, sp.load(getApplicationContext(), R.raw.musictest, 1));
        
    }

    private void playSound(int num,int loop){
         AudioManager am=(AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
         float currentSound=am.getStreamVolume(AudioManager.STREAM_MUSIC);
         float maxSound=am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
         volume=currentSound/maxSound;
         currentID=sp.play(hm.get(num), volume, volume, 1, loop, 1.0f);
    }


}

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM