Java 如何在简单的Android游戏中一次停止所有声音和动画的播放?
我正在阅读约翰·霍顿的《通过构建Android游戏学习Java》一书 这是一本相当不错的书,我正在游戏中打字。我有一个记忆游戏正在运行,它按顺序播放四个按钮中的一个按钮发出的声音,其长度逐渐增加(每回合增加一个) 我的代码有一个问题,就是按钮在我作为一个用户的同时震动并发出声音 如何添加延迟以立即停止所有事件?第一个序列只有一个按钮,因此它只会振动和发出一个按钮的声音-因此没有混淆 屏幕截图是序列中每个按钮振动的样子 我试过:Java 如何在简单的Android游戏中一次停止所有声音和动画的播放?,java,android,Java,Android,我正在阅读约翰·霍顿的《通过构建Android游戏学习Java》一书 这是一本相当不错的书,我正在游戏中打字。我有一个记忆游戏正在运行,它按顺序播放四个按钮中的一个按钮发出的声音,其长度逐渐增加(每回合增加一个) 我的代码有一个问题,就是按钮在我作为一个用户的同时震动并发出声音 如何添加延迟以立即停止所有事件?第一个序列只有一个按钮,因此它只会振动和发出一个按钮的声音-因此没有混淆 屏幕截图是序列中每个按钮振动的样子 我试过: ... case 1: //play
...
case 1:
//play a sound
button1.startAnimation(wobble);
soundPool.play(sample1, 1, 1, 0, 0, 1);
try {
wait(1000);
}
catch(Exception e){
System.out.println("Unable to wait");
}
break;
...
对于每个按钮/案例语句-但它不起作用
为了我自己的利益,我已经测试过,正如你所说,我处于主线中:-
if(Looper.myLooper() == Looper.getMainLooper())
给出“真实”
最近的尝试。仍在主线程中,但仍在线程中。播放前睡眠(毫秒)。按钮动画和声音之间仍不能正确暂停。没有什么事情会同时发生两三次
case 1:
//hide a button
button1.setVisibility(View.INVISIBLE);
//play a sound
try {
if(Looper.myLooper() == Looper.getMainLooper())
{
System.out.println("In main thread!!");
// Current Thread is Main Thread.
}
Log.i("info","trying to wait");
Thread.sleep(3000);
}
catch(Exception e){
System.out.println("Could not wait");
}
button1.startAnimation(wobble);
soundPool.play(sample1, 1, 1, 0, 0, 1);
break;
我试过了
button1.wait(3000) ;
在一个试接块中。这也行不通。两个按钮将同时设置动画。声音池play()
方法将立即返回,声音将异步播放。如果没有,您将无法从主UI线程调用它,因为该线程需要随时准备处理来自应用程序框架的消息
case 1:
//hide a button
button1.setVisibility(View.INVISIBLE);
//play a sound
try {
if(Looper.myLooper() == Looper.getMainLooper())
{
System.out.println("In main thread!!");
// Current Thread is Main Thread.
}
Log.i("info","trying to wait");
Thread.sleep(3000);
}
catch(Exception e){
System.out.println("Could not wait");
}
button1.startAnimation(wobble);
soundPool.play(sample1, 1, 1, 0, 0, 1);
break;
出于同样的原因,在主线上睡觉会产生不良影响(比如编舞抱怨)。如果您睡眠时间足够长,系统将弹出一个“应用程序没有响应”对话框,原因很简单,您的应用程序没有响应(它正在睡眠)
处理这一问题的最简单方法是使用一个定时消息函数向自己发送一条延迟消息,如。将在指定延迟后在当前线程上执行Runnable。为以后的每个活动发布一个
您可以使用一个单独的线程来驱动计时,但由于您的UI基于视图元素,因此您将在线程之间来回传递消息,而简单的“短延迟后执行X”并不需要复杂度。您正在搜索
线程。睡眠(毫秒级)
?因为这就是你“暂停”程序的方式。我已经试过了上面问题中编辑的Thread.sleep(毫秒)。它没有产生预期的结果。甚至还有“我/编舞”﹕ 跳过183帧!应用程序可能在其主线程上做了太多工作。“睡眠需要在播放之前而不是之后,因为每次单击都是异步处理的。遗憾的是,当声音停止时,声音池不会发出通知。你永远不能把睡眠放在主线程中,否则Android会引发ANR。你需要在一个单独的线程中处理这个行为。你能给我一些关于如何将我的代码放在一个单独的线程中的指针吗?if(Looper.myLooper()==Looper.getMainLooper())按照您的建议在主线程中给出“true”。我遵循了这本书的程序,但我不确定如何将其提升到下一个级别。可能有一个函数button1.waitForAnimation()或这种格式的东西,它会阻止动画完成。
button1.wait(3000) ;