我开始使用android和java。
我尝试制作一个西蒙游戏但有一些问题。
我写这个是为了显示simon按钮序列或播放器按下的按钮:
if (but_num == 1) {
ib1.setImageResource(R.drawable.bullet_square_green);
MediaPlayer sound = MediaPlayer.create(this, R.raw.tone_green);
sound.start();
for (int x = 1; x < 10000000; x++) { };
ib1.setImageResource(R.drawable.bullet_ball_green);
} else if (but_num == 2) {
它应该改变每个图像按钮的图像,播放声音,等待一段时间(对于{})然后 再次改变图像......
但它效果不好......它播放声音并真正通过bullet_square_xxx更改图像,但是眼睛无法看到图像更改,只有图像不会再次被更改后才能看到更改bullet_ball_xxx: - (
我认为这是我的错,因为我写的代码不同于java真的有效......我是一个 初学者,不要在java中思考......我脑子里已经有了基本的程序结构。
谢谢你,对不起我的英文!
答案 0 :(得分:0)
这可能是由于事件调度线程的延迟以及编译器甚至可能忽略空循环这一事实引起的,因为它是静态的,很容易预测它对程序没有影响。我的建议是首先在GUI上强制重新绘制/更新并使用Thread.sleep。像这样:
if (but_num == 1) {
ib1.setImageResource(R.drawable.bullet_square_green);
updateUI(); // if you are somewhere in a class extending any Frame/Panel
//If you are in other class use mainFrame.repaint();
MediaPlayer sound = MediaPlayer.create(this, R.raw.tone_green);
sound.start();
try{
Trhead.sleep(3000);
} catch (InterruptedException e) {}
ib1.setImageResource(R.drawable.bullet_ball_green);
updateUI(); //only if this effect is delayed too
} else if (but_num == 2) {
答案 1 :(得分:0)
好吧....我认为延迟是你代码中的问题。由于现在有高速处理器可用,在几毫秒内可以达到10000000,我的确如此。因此,不要使用old-school for循环来引入延迟使用
的Thread.sleep(5000);
这导致延迟5秒,参数是以毫秒为单位的时间。
答案 2 :(得分:0)
还有另一个讨论引入延迟的话题: How to pause / sleep thread or process in Android?
你可以尝试这个[我复制了从那个帖子粘贴]:
if (but_num == 1) {
ib1.setImageResource(R.drawable.bullet_square_green);
MediaPlayer sound = MediaPlayer.create(this, R.raw.tone_green);
sound.start();
// SLEEP 2 SECONDS HERE ...
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
ib1.setImageResource(R.drawable.bullet_ball_green);
}
}, 2000);
} else if (but_num == 2) {