mouseOver和mouseOut在更改大小画布上

时间:2011-06-08 09:21:43

标签: flex actionscript-3 flex4 mxml

我在MXML中构建一个具有不同状态的图形组件,每个状态都有自己的大小。

我有一个“正常”状态和一个“突出显示状态”,突出显示的状态有更高的高度。

在这个组件上,我实现了一个在每个mouseOver和mouseOut上执行的函数,以便从正常状态变为高亮状态并返回。

我的问题是,在突出显示的模式下,mouseout事件是根据正常状态的大小触发的。

以下是代码:

<mx:Canvas xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:mx="library://ns.adobe.com/flex/mx"
       xmlns:controller="com.*"

       mouseOver="mouseOverHandler(event)" mouseOut="mouseOutHandler(event)"
       width="230" height.Playing="40" height.Normal="21" height.Highlighted="40">
<mx:states>
    <mx:State name="Normal" />
    <mx:State name="Playing" />
    <mx:State name="Highlighted" />
</mx:states>
<mx:Button includeIn="Highlighted" left="19" bottom="2" width="15" height="15" />
</mx:Canvas>

我使用mouseOuver和mouseOut的方式有什么问题吗?

谢谢,

亚历山大

1 个答案:

答案 0 :(得分:1)

  

我正在构建一个图形组件   MXML具有不同的状态,每个   国家有自己的规模。

您对Flex组件架构的工作原理存在误解。组件永远不会自我调整。父母一直在决定孩子的大小。您可以覆盖measure方法来设置measuredWidth和measuredHeight;但是这些只是提供给组件父级的建议。它是决定是否接受它们的组成部分。

因此,在您的示例中,您可以更改按钮(孩子)的高度/宽度;但是你不能改变画布的高度/宽度(你正在扩展的组件)并期望它坚持下去。

如果没有看到包含此​​画布组件的代码,很难确定发生了什么。但是,在这种情况下,您应该覆盖measure方法以更改measuredWidth / measuredHeight。像这样:

override protected measure():void{
 if(currentState=='Normal'){
  measuredWidth = 0;
  measuredHeight = 0;
 } else {
  measuredWidth = button.width;
  measuredHeight = button.height;
 }
}

当状态改变时,一定要调用invalidateSize()方法。您可以通过收听currentStateChange事件来完成此操作。

理论上,这将导致组件改变measuredWidth / measuredHeight;这将强制父母也重绘自己,适应新的measuredWidth / measuredHeight。

MXML掩盖了很多这些细节。