1. 程式人生 > >Android移動開發-使用SoundPool播放音效的實現

Android移動開發-使用SoundPool播放音效的實現

如果在程式應用中(比如:遊戲的音效等)需要播放密集、短促的音效,這時就使用SoundPool來播放音效,SoundPool使用音效池的概念來管理多個短促的音效,例如它可以開始就10個音效,以後在程式中按音效的ID進行播放。
SoundPool主要用於播放一些較短的聲音片段,與MediaPlayer相比,SoundPool的優勢在 於CPU資源佔用量低和反應延遲小。另外,SoundPool還支援自行設定聲音的品質、音量、播放比率等引數。

一般使用SoundPool播放聲音的步驟如下:
Step1:呼叫SoundPool.Builder的構造器建立SoundPool.Builder物件,並可通過該Builder物件為SoundPool設定屬性;
Step2:呼叫SoundPool的構造器建立SoundPool物件;
Step3:呼叫SoundPool物件的load()方法從指定資源、檔案中載入聲音。最好使用HashMap< Integer, Integer>來管理所載入的聲音;
Step4:呼叫SoundPool的play()方法播放聲音。

下面的Demo程式示範瞭如何使用SoundPool來播放音效,該程式提供三個按鈕,分別用於播放不同的聲音。

  • layout/activity_main.xml介面程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation
="horizontal">
<Button android:id="@+id/bomb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="爆炸聲" /> <Button android:id="@+id/shot" android:layout_width="wrap_content" android:layout_height
="wrap_content" android:text="射擊聲" />
<Button android:id="@+id/arrow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="射箭聲" /> </LinearLayout>
  • MainActivity.java邏輯程式碼如下:
package com.fukaimei.soundpooltest;

import android.media.AudioAttributes;
import android.media.SoundPool;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.HashMap;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button bomb, shot, arrow;
    // 定義一個SoundPool
    SoundPool soundPool;
    HashMap<Integer, Integer> soundMap = new HashMap<>();

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bomb = (Button) findViewById(R.id.bomb);
        shot = (Button) findViewById(R.id.shot);
        arrow = (Button) findViewById(R.id.arrow);
        AudioAttributes attr = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_GAME)  // 設定音效使用場景
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build();  // 設定音效的型別
        soundPool = new SoundPool.Builder().setAudioAttributes(attr)  // 設定音效池的屬性
                .setMaxStreams(10) // 設定最多可容納10個音訊流
                .build();  // ①
        // load方法載入指定音訊檔案,並返回所載入的音效ID
        // 此處使用HashMap來管理這些音訊流
        soundMap.put(1, soundPool.load(this, R.raw.bomb, 1)); // ②
        soundMap.put(2, soundPool.load(this, R.raw.shot, 1)); // ②
        soundMap.put(3, soundPool.load(this, R.raw.arrow, 1)); // ②
        bomb.setOnClickListener(this);
        shot.setOnClickListener(this);
        arrow.setOnClickListener(this);
    }

    // 重寫OnClickListener監聽器介面的方法
    @Override
    public void onClick(View v) {
        // 判斷哪個按鈕被單擊
        if (v.getId() == R.id.bomb) {
            soundPool.play(soundMap.get(1), 1, 1, 0, 0, 1);  // ③
        } else if (v.getId() == R.id.shot) {
            soundPool.play(soundMap.get(2), 1, 1, 0, 0, 1);  // ③
        } else if (v.getId() == R.id.arrow) {
            soundPool.play(soundMap.get(3), 1, 1, 0, 0, 1);  // ③
        }
    }
}

上面Demo程式程式碼中標①的程式碼用於建立SoundPool物件;標②的程式碼用於使用SoundPool載入多個不同的聲音;標③的程式碼則用於根據聲音ID來播放指定的聲音。這就是使用SoundPool播放聲音的標準過程。
實際使用SoundPool播放聲音時有如下幾點需要注意:SoundPool雖然可以一次性載入多個聲音,但由於記憶體限制,因此應該避免使用SoundPool來播放歌曲,只有那些短促、密集的聲音才考慮使用SoundPool進行播放。

  • Demo程式執行效果介面截圖如下:
    這裡寫圖片描述

相關推薦

Android移動開發-使用SoundPool播放音效實現

如果在程式應用中(比如:遊戲的音效等)需要播放密集、短促的音效,這時就使用SoundPool來播放音效,SoundPool使用音效池的概念來管理多個短促的音效,例如它可以開始就10個音效,以後在程式中按音效的ID進行播放。 SoundPool主要用於

Android移動開發-使用VideoView播放視訊的實現

為了在Android應用中播放視訊,Android提供了VideoView控制元件,它就是一個位於android.widget包下的控制元件,它的作用與ImageView類似,只是ImageVie

Android移動開發-檢測點選按鍵事件的實現

檢測點選按鍵事件一般不對手機上的輸入按鍵進行處理,直接由系統按照預設情況操作。當然有時為了改善使用者體驗,需要讓應用攔截按鍵事件,並進行額外處理。 要想監控按鍵事件,首先得知道每個按鍵的編碼,這樣才能根據不同的編碼值進行相應的處理。監聽器OnKeyL

Android移動開發-使用URLConnection提交請求的實現

URL的openConnection()方法將返回一個URLConnection物件,該物件表示應用程式和URL之間的通訊連線。程式可以通過URLConnection例項向該URL傳送請求,讀取URL引用的資源。 通常建立一個和URL的連線,併發

Android移動開發-藍芽(BlueTooth)裝置檢測連線的實現

無論是WIFI還是4G網路,建立網路連線後都是訪問網際網路資源,並不能直接訪問區域網資源。比如兩個人在一起,A要把手機上的視訊傳給B,通常情況是開啟手機QQ,通過QQ傳送檔案給對方。不過上傳視訊很耗流量,如果現場沒有可用的WIFI,手機的資料流量又不足,那

Android移動開發 實現按鈕機制的三種方法

       Android開發中有三種主要的方式用於設定View的點選事件,1、建立內部類;2、主類中實現OnClickListener介面;3、使用匿名內部類。這三種方式都用到了OnClickListener介面,只是不同形式而已。其中OnClickListener是監

Android移動開發-使用OpenGL來繪製3D紋理圖的實現

OpenGL(全寫Open Graphics Library)是指定義了一個跨程式語言、跨平臺的程式設計介面規格的專業的圖形程式介面。它用於三維影象(二維的亦可),是一個功能強大,呼叫方便的底層圖形庫。 OpenGL是行業領域中最為廣泛接納的 2D/

Android移動開發-在Android專案裡整合face++人臉識別的實現

“人工智慧”是今年比較火的一個名詞,甚至大多數人認為“人工智慧”是繼“IT網際網路”之後一個新的浪潮,將會是本世紀最高科技的水準。個人覺得,目前國內語音識別做的比較好的是科大訊飛,影象識別(或人臉識別)做的比較好的是face++(曠視)。 那麼,

Android移動開發-呼叫攝像頭進行拍照的實現

現在Android智慧手機的畫素都會提供照相的功能,大部分的手機的攝像頭的畫素都在1000萬以上的畫素,有的甚至會更高。它們大多都會支援光學變焦、曝光以及快門等等。 下面的程式Demo例項示範了使用Camera v2來進行拍照,當用戶按下拍照鍵時

Android移動開發-在Android專案裡整合呼叫微信支付開發實現

如今移動支付比較火,尤其是在中國的市場。移動支付也稱為手機支付,就是允許使用者使用其移動終端(通常是手機)對所消費的商品或服務進行賬務支付的一種服務方式。單位或個人通過移動裝置、網際網路或者近距離感測直接或間接向銀行金融機構傳送支付指令產生貨幣支付與資金轉

Android移動開發-在Android應用裡整合QQ分享的實現

QQ分享分為QQ好友分享與QQ空間分享同屬QQ互聯平臺上的QQ分享,該QQ互聯的網址為:https://connect.qq.com/ 。然後在該網址裡申請開發者應用id。 建立工程並配置工程 新建工程並匯入SDK的jar檔案(SDK

Android移動開發-下拉重新整理SwipeRefreshLayout的實現

現在的社交軟體如微博、微信朋友圈以及QQ空間等都提供下拉重新整理的功能,把頁面整體下拉即可觸發頁面重新整理操作。Android提供了下拉重新整理控制元件SwipeRefreshLayout,可用於

Android移動開發-音樂的示波器、均衡、重低音和音場的實現

本Demo無須介面佈局檔案,使用一個LinearLayout容器來盛裝一個示波器View元件,該示波器View元件將負責繪製Visualizer傳過來的資料:LinearLayout新增多個SeekBar來控制Equalizer支援的所有頻率的均衡值;Li

android應用開發-從設計到實現 3-4 靜態原型的狀態欄

不同的 討論 group 手把手教你 copy lac csdn article statusbar 靜態原型的狀態欄 狀態欄Symbol 狀態欄似乎非常復雜,有wifi信號、手機信號、時間、電量等信息,幸好Sketch原生就自帶的現成組件,你能

android移動開發的一點體會

協作開發 自動化 成了 省電 概率 很多 sim卡 體會 message 做手機的一點體會 整個android系統是一個完整的生態系統,谷歌提供開放的android平臺,下遊有各種生產硬件的廠家提供各種手機的硬件,像富士康這樣的工廠提供手機的代加工, 然後是高通這樣的公司提

Android移動開發01----用Android Studio進行開發

    一直以來都用Eclipse進行開發,但是最近發現Eclipse執行越來越緩慢,再加上自己的電腦已入暮年,時不時卡頓一下實在讓人受不了。在開發Ruby的時候接觸了RubyMine,一個基於IntelliJ IDEA的IDE,功能強大,速度比較快。於是決定拋棄Ecl

Android移動開發檢測網路狀態並使用BroadcastReceiver(廣播接收者)進行接收網路變化的後續處理

在Android開發中,許多功能需要網路連線,所以在開發過程中需要進行手機網路的檢測。而每做一個App,就要進行檢測,那麼我直接將檢測網路狀態的功能封裝成一個類。 檢測網路狀態所需要的Api: ConnectivityManager主要用於檢視網路狀態和管理網路連線相關的

Android移動開發中通用技術整理

悲劇的住院了,閒來無聊。整理下以前做的幾個專案的寫下的筆記。 因為專案的通用性,以前老大給的建議是能做成類似於封裝完的jar包。 因為沒什麼時間,還有老大太高估我了 = =。 在此只是列一下幾個通用技術 通用技術一:App進入後的網路檢測。 程式碼很簡單 import a

Android練習專案 Mp3播放實現 歌詞同步播放(四)

其實到後面就需要我們如何顯示歌詞,對於歌詞的同步顯示還是比較好實現的,主要通過判斷當前播放的時間和每個結點的歌詞的時間的大小,來同步對應到結點的資料,現在就是如何來實現這個問題。 其實,這個時候就需要自定義控制元件來實現。 第一步需要自定義View的屬性。

Android練習專案 Mp3播放實現(一)

對於Android的學習,需要掌握的東西有點多,需要我們認真,小心,不斷的進取。前天突然有個想法,覺得Mp3播放器是一個可以練習的專案,於是在網上搜了下,發現有人已經寫了部落格,看了他們的部落格後,我覺得他們說的一點很對,Mp3播放器基本用到了Android裡面