1

コードを表示する前にこれを説明することはできません。

final int randomcolor = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256),
                rnd.nextInt(256));


    final Runnable updater = new Runnable() {
            @Override
            public void run() {


                    relativeLayout.setBackgroundColor(randomcolor);     

                    handler.postDelayed(this, 25);
                }
            }
        };

上には Updater という名前の実行可能ファイルがあり、下にはボタンのクリックで起動しています..

Button.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            handler.postDelayed(updater,2000 );

        }
    });

(私は自分のコードのほとんどを切り取ったので、これを実行したい理由が理解できないかもしれません。上記は、ランナブルが抜け出せずにスタックしているため、無限ループを作成します...抜け出すことができると仮定してくださいそれ。)

コードの説明

これはすべてOncreate()にあります...したがって、ボタンをクリックすると、2秒の遅延後にRunnableが起動します...そして、25ミリ秒のギャップごとに、同じrunnableが何度も何度も実行されます。時間の終わり (私が言ったように、この最後の点は無視してください。)

ランナブルで 1 つのことを行っているだけで、相対レイアウトの背景色を変更していることがわかります。

重要なのは、25 ミリ秒ごとに、つまりランナブルが実行されるたびに、相対的なレイアウトの背景色をランダムなものに変更する必要があることです。酔っ払ったド派手なてんかん誘発アプリになりそう… 理由は任せて(また)

問題は、ハンドラーが非最終のランナブルを取得できないことです...そして、すべての実行のランダム変数を最終にすることはできず、最終と非最終は一緒に機能しません。(もう一度読んで)

したがって、ランナブルが実行されるたびに新しい Color 整数が必要です...実行されるたびに、背景色が別のランダムなものに変更されるようにします。

解決策は非常に簡単だと思いますが、特定できないようです..

アイデアはありますか?どうすればこれを行うことができますか?

4

2 に答える 2

0

最も効率的なものではないかもしれませんが、最も簡単な解決策は、次のようにランナブル自体内で色を生成することです。

final Runnable updater = new Runnable() {
    @Override
    public void run() {
        final int randomcolor = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256),
            rnd.nextInt(256));
        relativeLayout.setBackgroundColor(randomcolor);     
        handler.postDelayed(this, 25);
    }
};
于 2013-09-19T15:13:54.500 に答える
0

これを言うのは汚いと思いますが、変数を配列またはリストでラップできます。

final int[] randomColorHack = new int[1]; 
final Runnable updater = new Runnable() {
        @Override
        public void run() {
                  randomColorHack[0] = 100;
            }
        }
    };

int out = randomColorHack[0];

// out == 0;
// until your updater is ran then it will == 100;

そして明らかに、ランナブルまたはリストが必要な場合:

 final List<Runnable> hackRunnable = new ArrayList<Runnable>();
 hackRunnable.put(updater);

 Button.setOnClickListener(new View.OnClickListener() {

    public void onClick(View v) {
           handler.postDelayed(hackRunnable.get(0), 2000);
    }
 }
于 2013-09-19T15:13:55.670 に答える