通过validateNow()正确重绘UIComponent

时间:2011-04-20 17:52:40

标签: flex actionscript-3

我正在移除UIComponent,但最后一部分可见。 它仅在我移动鼠标或其他东西时重绘。我试图在其父级validateNow()上尝试setTimeout(validateNow, 100),但它没有帮助。当我通过setTimeout调用它时,似乎这些工件很少显示,但在所有情况下都没有解决问题。请引导我某人阅读有关validateNow(),其工作原理以及如何正确制作这些内容的信息。

代码如下:

protected var bubble: SpeechBubble;

// creation

bubble = new SpeechBubble();
map.addChild(bubble);

//...

// removing

bubble.visible = false;
map.removeChild(bubble);
map.validateNow();
setTimeout(map.validateNow, 100);

地图是Google Map for Flex。

3 个答案:

答案 0 :(得分:2)

发生这种情况的原因是因为您正在搞乱谷歌地图绘图逻辑。您应该查看Google提供的developer guide。它在controls section中提到要创建自定义控件,您需要扩展ControlBase

答案 1 :(得分:1)

您可能需要在调用validateNow()之前触发失效。现在调用validate会导致代码检查是否设置了任何失效标志(属性,显示列表或大小),然后为每个调用调整失效的适当方法(commitProperties,updateDisplayList,measure)喜欢它只是没有清楚地调用图形或重新绘制,所以你可能需要调用

bubble.invalidateDisplayList();
bubble.validateNow();

也希望其中一个解决方案适合你,一般来说在给定时间强制验证通常不是一个好主意,因为框架组件应该在其生命周期中触发适当的失效和后续验证,但我不能说我自己没有这样做:)。

肖恩

答案 2 :(得分:-2)

您可以使用 includeInLayout 属性

bubble.visible = false;
bubble.includeInLayout = false;

示例演示了此属性

The Beauty of includeInLayout

希望有所帮助