4

これが私のコードです:

public class TestActivity extends Activity {    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        start();
    }

    private void start() {
        setContentView(R.layout.main);

        LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout);

        Button button = new Button(this);

        layout.addView(button);

        button.getBackground().setColorFilter(new LightingColorFilter(0x00000000, 0x0000FF00));  // green
        button.invalidate(); 

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        button.getBackground().setColorFilter(new LightingColorFilter(0x00000000, 0x000000FF));  // blue
        button.invalidate(); 
    }
}

これは、3 秒後に青いボタンを表示するだけです。緑として表示されることはありません。

私の脳が正常に機能していれば、次の投稿のいずれかから答えを見つけることができると思います。

私のAndroidゲームでview.invalidateがすぐに画面を再描画しないのはなぜですか

次のコード行が実行される直前にビューを強制的に再描画する方法

レイアウトビュー全体を強制的に更新する方法は?

4

2 に答える 2

2

インターフェイスがハングアップするため、UI スレッドでスリープしないでください。代わりに、最初に色を緑に設定した後、(UI スレッドで、そのスレッドを使用してメッセージを処理するように) Handler を作成し、Handler.postDelayedを使用して 3 秒で処理されるメッセージを送信できます。にRunnable渡すとpostDelayed、色を青に設定できます。

于 2013-02-25T00:57:03.890 に答える
1

色を設定した後、実質的に瞬時にメイン UI スレッドをスリープ状態にします。これは、再描画を行う前にスレッドがロックされていることを意味します。

これに対する 1 つの解決策は、スレッドを使用することです。背景色を設定し、別のスレッドを使用してスリープし、完了時にメイン (UI) スレッドを呼び出して色を再度変更します。

AsyncTaskまたはThreadingを調べてみてください。

于 2013-02-25T00:42:04.700 に答える