Android 调用声音池Thead onclick事件
我正在尝试在单击视图对象时播放声音池 我已经成功地实现了它,但是发现点击的声音会延迟 我一直在研究StackOverFlow和internet上的解决方案,最好的解决方案似乎是将声音池放在一个单独的线程上 我对整个线程的事情都很陌生,所以我现在真的不知道该做什么 我已经按照指南创建了一个声音池线程,但是,我不知道如何访问它,甚至不知道如何分配我想要播放的剪辑 有人可以给我一个例子,我应该如何调用SoundPool线程来播放我的剪辑,而视图中的对象正在被单击 请在下面找到我的onClick代码:Android 调用声音池Thead onclick事件,android,multithreading,onclick,soundpool,Android,Multithreading,Onclick,Soundpool,我正在尝试在单击视图对象时播放声音池 我已经成功地实现了它,但是发现点击的声音会延迟 我一直在研究StackOverFlow和internet上的解决方案,最好的解决方案似乎是将声音池放在一个单独的线程上 我对整个线程的事情都很陌生,所以我现在真的不知道该做什么 我已经按照指南创建了一个声音池线程,但是,我不知道如何访问它,甚至不知道如何分配我想要播放的剪辑 有人可以给我一个例子,我应该如何调用SoundPool线程来播放我的剪辑,而视图中的对象正在被单击 请在下面找到我的onClick代码:
@Override
public boolean onTouch(View v, MotionEvent event) {
int actionPerformed = event.getAction();
switch(actionPerformed) {
case MotionEvent.ACTION_DOWN: {
if (Math.pow((event.getX() - a_Ball.getX()),2)
+ Math.pow((event.getY() - a_Ball.getY()), 2)
<= Math.pow(a_Ball.getDiameter(),2)) {
//pCheck = !pCheck;
if (pauseBall == false) {
SoundPool soundPool = new SoundPool(1,AudioManager.STREAM_MUSIC,1);
clickSound = soundPool.load(MainActivity.this, R.raw.click, 1);
/*soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
public void onLoadComplete(SoundPool soundPool, int sampleId,int status) {
soundPool.play(clickSound,1.0f, 1.0f, 0, 0, 1.0f);
}
});*/
//Increase Ball Speed
sIncrease = true;
}
} else {
if (pauseBall == false) {
//set minus health when not touch on ball
health--;
TextView txtHealth = (TextView)findViewById(R.id.health);
String tempHealth = txtHealth.getText().toString();
tempHealth = getResources().getString(R.string.health) + String.valueOf(health);
txtHealth.setText(tempHealth);
}
}
break;
}
default:
return false;
}
return true;
} //onTouch end
@覆盖
公共布尔onTouch(视图v,运动事件){
int actionPerformed=event.getAction();
开关(已执行操作){
case MotionEvent.ACTION\u DOWN:{
if(Math.pow((event.getX()-a_Ball.getX()),2)
+Math.pow((event.getY()-a_Ball.getY()),2)
您不需要线程来无延迟地发出声音。延迟来自声音文件的加载,请尝试创建声音池并提前加载声音(SoundPool.load
)(例如,onCreate
),然后只需调用soundPool。在onTouch
方法中播放。好的,所以我决定不在另一个类中执行此操作,而是在一个类中执行此操作,并自己创建了一个新线程。似乎工作得足够好
我会将此线程标记为答案。感谢您的回复nicolas。我已将声音池的创建和加载移动到我的onCreate部分,并调用我的方法,但是,它仍然存在延迟…我使用的唯一临时解决方案是让它在静音状态下连续循环。我将尝试看看是否有其他解决方案。而不是ks再次回复这很奇怪,我在onTouch侦听器中使用SoundPool.play方法,没有任何延迟。我将0作为SoundPool构造函数的最后一个参数,尽管文档中说它没有效果。我还将SoundPool设置为并行播放多个声音(第一个参数,设置为6),因为我会播放几个声音。当一个声音还没有结束,下一个声音开始播放时,这也会有帮助。我知道,这是一些非常好的信息。我一定会尝试一下。但是有些人似乎和我有同样的问题,通过将其放入线程似乎可以完美地解决问题(目前).我会进一步调查的.再次感谢你的帮助