• android游戏开发系列(1)——迅雷不及掩耳的声音


    这种声音是短而快的声音,应该采用android.media.SoundPool实现。

    SoundPool的特点:

    1. SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作。但是这里如果音效文件过大没有载入完成,我们调用play方法时可能产生严重的后果,这里Android SDK提供了一个SoundPool.OnLoadCompleteListener类来帮助我们了解媒体文件是否载入完成,我们重载 onLoadComplete(SoundPool soundPool, int sampleId, int status) 方法即可获得。 
    2. 从上面的onLoadComplete方法可以看出该类有很多参数,比如类似id,是的SoundPool在load时可以处理多个媒体一次初始化并放入内存中,这里效率比MediaPlayer高了很多。 
    3. SoundPool类支持同时播放多个音效,这对于游戏来说是十分必要的,而MediaPlayer类是同步执行的只能一个文件一个文件的播放。 
    使用方法: 
    1. 创建一个SoundPool 

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

      maxStream —— 同时播放的流的最大数量 

      streamType —— 流的类型,一般为STREAM_MUSIC(具体在AudioManager类中列出) 

      srcQuality —— 采样率转化质量,当前无效果,使用0作为默认值 

      eg. 

      SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0); 

      创建了一个最多支持3个流同时播放的,类型标记为音乐的SoundPool。 


    2 一般把多个声音放到HashMap中去,比如 
        soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100); 
        soundPoolMap = new HashMap<Integer, Integer>();   
        soundPoolMap.put(1, soundPool.load(this, R.raw.dingdong, 1)); 

      soundpool的加载: 
          int  load(Context context, int resId, int priority)  //从APK资源载入 
      int  load(FileDescriptor fd, long offset, long length, int priority)  //从FileDescriptor对象载入 
      int  load(AssetFileDescriptor afd, int priority)  //从Asset对象载入 
      int  load(String path, int priority)  //从完整文件路径名载入 
    最后一个参数为优先级。 

    3 播放 
    play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) ,其中leftVolume和rightVolume表示左右音量,priority表示优先级,loop表示循环次数,rate表示速率,如 
    //速率最低0.5最高为2,1代表正常速度 
    sp.play(soundId, 1, 1, 0, 0, 1); 
      而停止则可以使用 pause(int streamID) 方法,这里的streamID和soundID均在构造SoundPool类的第一个参数中指明了总数量,而id从0开始。 

    例子:

    package wyf.zcl;
    
    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;
    import android.widget.Toast;
    
    public class MyActivity extends Activity {
        /** Called when the activity is first created. */
    	SoundPool sp;							//得到一个声音池引用
    	HashMap<Integer,Integer> spMap;			//得到一个map的引用
    	Button b1;								//声音播放控制按钮
    	Button b1Pause;								//声音暂停控制按钮
        Button b2;								//声音播放控制按钮
        Button b2Pause;								//声音暂停控制按钮
    	@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            initSoundPool();						//初始化声音池
            b1=(Button)findViewById(R.id.Button01);//声音播放控制按钮实例化
            b2=(Button)findViewById(R.id.Button02);//声音播放控制按钮实例化
            b1Pause=(Button)findViewById(R.id.Button1Pause);
            b2Pause=(Button)findViewById(R.id.Button2Pause);
            b1.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				playSound(1,1);		//播放第一首音效,循环一遍
    				Toast.makeText(MyActivity.this, "播放音效1", Toast.LENGTH_SHORT).show();
    		}});
            b1Pause.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				sp.pause(spMap.get(1));
    				Toast.makeText(MyActivity.this, "暂停音效1", Toast.LENGTH_SHORT).show();
    		}});
            b2.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				playSound(2,1);		//播放第二首音效,循环一遍
    			Toast.makeText(MyActivity.this, "播放音效2", Toast.LENGTH_SHORT).show();
    		}});
            b2Pause.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				sp.pause(spMap.get(2));
    				Toast.makeText(MyActivity.this, "暂停音效2", Toast.LENGTH_SHORT).show();
    		}});
        }
        public void initSoundPool(){			//初始化声音池
        	sp=new SoundPool(
        			5, 				//maxStreams参数,该参数为设置同时能够播放多少音效
        			AudioManager.STREAM_MUSIC,	//streamType参数,该参数设置音频类型,在游戏中通常设置为:STREAM_MUSIC
        			0				//srcQuality参数,该参数设置音频文件的质量,目前还没有效果,设置为0为默认值。
        	);
        	spMap=new HashMap<Integer,Integer>();
        	spMap.put(1, sp.load(this, R.raw.attack02, 1));
        	spMap.put(2, sp.load(this, R.raw.attack14, 1));
        }
        public void playSound(int sound,int number){	//播放声音,参数sound是播放音效的id,参数number是播放音效的次数
        	AudioManager am=(AudioManager)this.getSystemService(this.AUDIO_SERVICE);//实例化AudioManager对象
        	float audioMaxVolumn=am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);	//返回当前AudioManager对象的最大音量值
        	float audioCurrentVolumn=am.getStreamVolume(AudioManager.STREAM_MUSIC);//返回当前AudioManager对象的音量值
        	float volumnRatio=audioCurrentVolumn/audioMaxVolumn;
        	sp.play(
        			spMap.get(sound), 					//播放的音乐id
        			volumnRatio, 						//左声道音量
        			volumnRatio, 						//右声道音量
        			1, 									//优先级,0为最低
        			number, 							//循环次数,0无不循环,-1无永远循环
        			1									//回放速度 ,该值在0.5-2.0之间,1为正常速度
        	);
        }
    }

    代码下载:http://download.csdn.net/detail/lxq_xsyu/6268039

    运行结果:




  • 相关阅读:
    LeetCode153 Find Minimum in Rotated Sorted Array. LeetCode162 Find Peak Element
    LeetCode208 Implement Trie (Prefix Tree). LeetCode211 Add and Search Word
    LeetCode172 Factorial Trailing Zeroes. LeetCode258 Add Digits. LeetCode268 Missing Number
    LeetCode191 Number of 1 Bits. LeetCode231 Power of Two. LeetCode342 Power of Four
    LeetCode225 Implement Stack using Queues
    LeetCode150 Evaluate Reverse Polish Notation
    LeetCode125 Valid Palindrome
    LeetCode128 Longest Consecutive Sequence
    LeetCode124 Binary Tree Maximum Path Sum
    LeetCode123 Best Time to Buy and Sell Stock III
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469676.html
Copyright © 2020-2023  润新知