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 秒后显示一个蓝色按钮;它永远不会显示为绿色。

我认为,如果我的大脑工作正常,我可以从以下帖子中找出答案:

为什么 view.invalidate 不立即在我的 android 游戏中重绘屏幕

如何在执行下一行代码之前强制视图重绘

如何强制整个布局视图刷新?

4

2 回答 2

2

您不应该在 UI 线程上休眠,因为这会挂起您的界面。相反,在最初将颜色设置为绿色后,您可以创建一个 Handler(在 UI 线程上,因此它将使用该线程来处理消息),然后使用Handler.postDelayed发送将在 3 秒内处理的消息。在Runnable你传递给postDelayed你可以将颜色设置为蓝色。

于 2013-02-25T00:57:03.890 回答
1

设置颜色后,您几乎立即进入主 UI 线程。这意味着线程在有机会进行重绘之前被锁定。

一种解决方案是使用线程。设置背景颜色,然后使用另一个线程休眠,完成后调用主(UI)线程再次更改颜色。

您可以尝试查找AsyncTaskThreading

于 2013-02-25T00:42:04.700 回答