android 遊戲開發之聲音

來源:互聯網
上載者:User

在今天的文章中我們將展示如何建立,管理和使用Android中的音效。在第一部分我們將展示基本的封裝與管理聲音有關代碼的方法。這個方法可以正常工作當你有一個典型的應用程式或者單線程的簡單遊戲。在你閱讀完這些之後,可以閱讀第二部分,它將告訴你一個更進階的方式來管理聲音通過其他的類。

        我們用來播放聲音的方法利用Sound Pool類而不是Android開發嚮導推薦的Media Player類。當然利用Media Player類實現簡單應用也是可以的,但是這個類不能提供我們所需要的靈活性。

        下面是代碼。我們首先需要建立一個Sound Manager類來封裝所有的與聲音有關的代碼。

Java代碼:
  publicclassSoundManager{
  
  privateSoundPoolmSoundPool;
  privateHashMapmSoundPoolMap;
  privateAudioManagermAudioManager;
  privateContextmContext;
  }


代碼的第一部分是建立所需要的成員變數:

         mSoundPool: 我們利用Android提供的這個對象來建立和播放聲音;
         mSoundPoolMap: 一旦聲音載入了,就用散列表來儲存;
         mAudioManager: 播放我們想要音樂的服務的控制代碼.
         mContext: 一個程式內容相關的控制代碼.

Java代碼:
  publicvoidinitSounds(ContexttheContext){
  mContext=theContext;
  mSoundPool=newSoundPool(4,AudioManager.STREAM_MUSIC,0);
  mSoundPoolMap=newHashMap();
  mAudioManager=(AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
  }

        第一個函數建立了Sound Manager。在一開始我們傳遞程式上下文給它並且得到一個它的控制代碼。下一行建立sound pool對象。我們要注意第一個參量,這個傳遞的整型值代表我們希望同時存在多少個音頻流。換句話說,多少聲音可以同時播放。如果你嘗試播放比這個整型值多的音頻,它會自動終止最早的音頻流。

       下面兩行建立散列表並且將它交給audio-manager

Java代碼:
  publicvoidaddSound(intindex,intSoundID)
  {
  mSoundPoolMap.put(index,mSoundPool.load(mContext,SoundID,1));
  }

       我們在這個函數添加音頻。每一個音頻檔案得到一個用於回放的索引,要確保每個音頻有不同的索引。SoundID參數來自於原始音頻檔案。你可以傳遞這個參數通過調用R.raw.mysound來得到名為mysound的音訊id。後面會介紹如何運用這個函數。

Java代碼:
  publicvoidplaySound(intindex)
  {
  floatstreamVolume=mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
  streamVolume=streamVolume/mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
  mSoundPool.play(mSoundPoolMap.get(index),streamVolume,streamVolume,1,0,1f);
  }
  
  publicvoidplayLoopedSound(intindex)
  {
  floatstreamVolume=mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
  streamVolume=streamVolume/mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
  mSoundPool.play(mSoundPoolMap.get(index),streamVolume,streamVolume,1,-1,1f);
  }

       這兩個函數控制聲音的回放。你只需要傳遞你在addSound()中建立的音訊索引數字。streamVolume變數用來擷取當前裝置上所設定媒體檔案播放的音量。因為我們不希望音頻回放時音量比使用者在手機上設定的音量有所不同。

        你需要將獲得的音量除以最大的流媒體音量值,以便於得到一個0到1之間的浮點數。這是要實現播放所必需的,這裡要感謝Gyuri為我指出這個問題。

        mSoundPool.play函數相當簡單。首先要傳遞你希望播放的音訊索引數字,之後兩個參數分別是播放時的音量下限和上限。我強烈建議設定該兩個值都等於音訊音量。

       下一個變數是音訊優先順序。這個目前還沒有實現,所以設定為1是比較好的。再下一個參數是設定音頻是否迴圈播放。-1設定為迴圈而1設定為單次播放。這也是這兩個函數的唯一不同之處。我個人就比較喜歡能夠允許我設定迴圈播放的裝置。

       最後一個參數影響播放的採樣率。1是正常速率而可以設定範圍從0.5到2.0對應於半速和二倍速播放。

       使用這個類是非常簡單的。你需要做的就是當你需要音訊時候建立一個成員變數。之後你可以初始化sound manager而且用下面的方式添加音頻。

Java代碼
 
 mSoundManager=newSoundManager();
  mSoundManager.initSounds(getBaseContext());
  mSoundManager.addSound(1,R.raw.sound);

  之後根據索引播放音頻。


Java代碼:
  
mSoundManager.playSound(1);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.