0

1 つの画像ビューと、カードが赤か黒かを推測するための 2 つのボタンを備えた単純なゲームを作成したいと考えています。

スレッドを使用したいのですが、プレイヤーがボタンを押す前に 0.1 秒ごとにカードが変化します。

これは私がこれまでに使用したものです:

Thread timer = new Thread() {
        public void run() {
            while (true) {
                try {
                    if(!isInterrupted())
                        sleep(100);
                    else
                        sleep(5000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if(!isInterrupted()) {
                                if (iv_card_to_Guess.getDrawable() == null)
                                    iv_card_to_Guess.setImageBitmap(deck_card);
                                else
                                    iv_card_to_Guess.setImageDrawable(null);
                            }
                            else {
//here need to update imageview with the actual image of the card, not just the deck or null
// for example 5 of Hearts

                                loadBitmap(getResourceID("img_" + numbers.get(count).toString(), "drawable", getApplicationContext()), iv_card_to_Guess);
                            }
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }
    };

ボタンを押すと電話がかかるtimer.interrupt();

アプリケーションは実際のカードの画像を変更しますが、5 秒ではなく 0.1 秒も変更します:)

どうすればいいですか?

4

2 に答える 2

0

あなたがしていることは、いくつかの不確実性をもたらします。正確な実装についてはわかりませんが、isInterrupted()返されたときにantrueを呼び出すと、スリープせずにすぐにスローされる可能性があります。さらに、メイン スレッドの Runnable は、中断された状態がクリアされる前に実行される可能性があるため、意図したようにカードが表示され、while ループの次の反復で削除され、0.1 秒間だけ浸透します。sleep(5000)InterruptedException

代わりに、点滅効果に Android アニメーションを使用することをお勧めします。

if (iv_card_to_Guess.getDrawable() == null)
    iv_card_to_Guess.setImageBitmap(deck_card);
else
    iv_card_to_Guess.setImageDrawable(null);

startAnimation()2つの方法を導入するのが最善stopAnimationです。Androidのアニメーションとグラフィックスのガイドを見つけることができます。

これらを使用すると、ボタンがクリックされたときにアニメーションを停止し、View.postDelayed(run, delay)カードに 5 秒の露出時間を与えるために再び開始することができます。

public void onClick(View v) {
    stopAnimation();
    loadBitmap(getResourceID("img_" + numbers.get(count).toString(), "drawable", getApplicationContext()), iv_card_to_Guess);
    iv_card_to_Guess.postDelayed(new Runnable() {
        startAnimation();
    }, 5000);
}
于 2015-07-18T09:39:12.397 に答える