zoukankan      html  css  js  c++  java
  • 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);
        }
    
    
    }

    运行结果:

  • 相关阅读:
    第12组 Beta冲刺 (4/5)
    第12组 Beta冲刺 (3/5)
    代码用辅助多了 基础的读取config都忘记了
    wpf 动态添加控件 通过xmal实习 c#代码插入控件
    C#里调用非托管的Dll -z注意 net版本
    动态调用 类库
    c#时间的生成
    c# 第三方 修改版本号 MSBuildTasks, 解决 通配符不匹配问题
    c#.exe以管理员身份运行
    log4
  • 原文地址:https://www.cnblogs.com/hexiaochun/p/2674864.html
Copyright © 2011-2022 走看看