我已经阅读了几个关于使用 invalidate() 以便立即更新视图的论坛和示例,但我仍然不明白为什么我所做的不起作用。下面的代码使用由“红色”、“蓝色”、“绿色”和“黄色”定义的图像按钮。我在每次尝试更改按钮外观之间设置了 1 秒的延迟。请有人告诉我我做错了什么。
private void showPattern() {
if (correct == true) {
for (int k = 0; k < temp_basket.length; k++) {
if (temp_basket[k] == 0) {
red.setPressed(true);
red.invalidate();
final Handler handler = new Handler();
Timer t = new Timer();
t.schedule(new TimerTask() {
public void run() {
handler.post(new Runnable() {
public void run() {
red.setPressed(false);
red.invalidate();
}
});
}
}, 1000);
在这之后还有 3 个以上的块,分别是蓝色、绿色和黄色。
Invaliadate 将重绘消息放入队列中
正如我在您的代码中看到的,在另一个重绘之后发生了多个重绘...操作系统将尝试通过将多个重绘消息合并为一个来优化渲染(在它们之间没有其他消息的情况下)。
您可能想做的是:
private Handler myHandler = new Handler() {
public void handleMessage(Message msg)
{
switch(msg.what) { /* do your work */ }
}
};
Message msg = Message.obtain(myHandler);
msg.what = <some-number>;
msg.obj = <your-data-to-process>
if(myHandler.containsMessage(<same-number>) {
myHandler.removeMessages(<same-number>);
}
myHandler.sendMessage(msg);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)