2011-06-08 88 views
0

我在MXML中構建了一個具有不同狀態的圖形組件,每個狀態都有其自己的大小。mouseOver和mouseOut改變大小畫布

我有一個「正常」狀態和一個「強調狀態」時,突出顯示的一個具有較高的高度。

在此分量I實現的功能,以在每個的mouseOver及移出時執行,以從正常狀態到突出顯示的狀態,返回改變。

我的問題是,在高亮模式下,根據正常狀態的尺寸被觸發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及移出的方式嗎?

感謝,

亞歷山大

+0

我已經找到另一個問題的解決方案:http://stackoverflow.com/questions/557028/how-to-stop-mouse-out-event-on-flex-canvas-firing-for-child-elements – Alexandre 2011-06-08 12:47:29

回答

1

我建立在 MXML具有不同狀態的圖形組件,具有其自身的大小各 狀態。

您對Flex組件體系結構的工作方式存在誤解。組件永遠不會自行調整大小確定孩子的大小總是由父母決定。您可以覆蓋度量方法來設置measuredWidth和measuredHeight;然而,這些只是提供給組件父母的建議。它是決定是否接受它的組成部分或否。

所以,在你的榜樣,您可以更改按鈕(孩子)的高度/寬度;但您無法更改畫布的高度/寬度(您正在擴展的組件)並期望它堅持下去。

沒有看到包含此​​畫布組件的代碼,它很難肯定地說這是怎麼回事。但是,在這種情況下,您應該重寫度量方法以更改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掩蓋了很多這些細節。

+0

感謝這些建議。正如我對我的問題所說的評論,我通過使用rollOver/rollOut事件解決了我的問題。 mouseOver和rollOver的區別在於前者考慮指定組件的mouseOver子組件,而後者則考慮組件本身。 – Alexandre 2011-06-10 07:54:07