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);
    }


}

运行结果:

转载于:https://www.cnblogs.com/hexiaochun/archive/2012/09/07/2674864.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值