我在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的方式有什么问题吗?
谢谢,
亚历山大
答案 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掩盖了很多这些细节。