我正在创建一个应用程序,它将在屏幕上显示多个图像,这些图像将是按钮,当点击时将播放短暂的声音。我研究了这个并且只能找到我用来播放声音的当前方法,它根本没有响应。我希望声音能够快速播放并响应许多快速的声音。我不确定这在Android中是否可行。
我用来播放声音的代码是:
Button sound1;
MediaPlayer firstSound;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
firstSound = MediaPlayer.create(SoundActivity.this, R.raw.click);
sound1 = (Button) findViewById(R.id.Sound1);
beaver.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
firstSound.start();
}
});
}
我的滞后问题也可能与我使用媒体播放器对象的方式有关?我觉得这应该在我的手机上更流畅,任何关于如何在Android中播放声音的建议都值得赞赏。
感谢。
自从发现Sound Pool以来,我已经编辑了我的代码以使用它并且它运行良好,新代码如下所示:
SoundPool soundPool;
HashMap<Integer, Integer> soundPoolMap;
int soundID = 1;
Button sound1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
soundPoolMap = new HashMap<Integer, Integer>();
soundPoolMap.put(soundID, soundPool.load(this, R.raw.click, 1));
sound1 = (Button) findViewById(R.id.bBeaver);
sound1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float leftVolume = curVolume/maxVolume;
float rightVolume = curVolume/maxVolume;
int priority = 1;
int no_loop = 0;
float normal_playback_rate = 1f;
soundPool.play(soundID, leftVolume, rightVolume, priority, no_loop, normal_playback_rate);
}
});
}
由于
答案 0 :(得分:27)
您可以使用SoundPool
。它符合你想要做的完美。
您只需要一种方法来存储与每个图像(或按钮)对应的音效ID。
也许扩展Button以存储相关的音效ID。并且当触摸按钮时,使用常用的SoundPool播放与id相关的声音效果。
答案 1 :(得分:3)
@Rikonator与Soundpool在正确的轨道上。它更适合您所追求的功能。
但是,如果您决定使用媒体播放器,请不要忘记prepareAsync()方法以防止它挂起UI线程。您可以阅读有关播放媒体here的更多信息。
答案 2 :(得分:2)
// +build !race