2010-06-18 52 views
0

我的itemRenderer有2個自定義的國家,也沒有懸停狀態,沒有正常的狀態禁用的itemRenderer徘徊狀態

<s:states> 
    <s:State name="state1" /> 
    <s:State name="state2" /> 
</s:states> 

當我初始化它,我強迫它去state2。問題是,當鼠標rolls out遠離物品時,它會重新回到第一個狀態state1。這有點奇怪,因爲我真的沒有懸空/懸空狀態。任何人都知道如何防止這種情況發生?也許通過某種方式禁用rollout效果?

回答

0

我會考慮做一些與鼠標事件,比如鼠標懸停

http://docs.huihoo.com/flex/4/flash/display/InteractiveObject.html#event:mouseOver

不過,我敢肯定,當你使用的東西作爲itemRenderer的,list類可以發揮一些控制itemRenderer。 List類完全可能導致您看到的行爲。你在用什麼課?你的渲染器是什麼?

+0

這是一個列表中的itemrenderer。經過仔細觀察後,它似乎會在重新啓動時重置。有沒有辦法讓我可以重置內置的推出效果而不做任何事情。 – duder 2010-06-18 17:13:03

+0

我不確定「重置」是什麼意思。您可能想要查看樣式selectionColor和rollOverColor。 http://docs.huihoo.com/flex/4/spark/components/List.html#styleSummary – JeffryHouser 2010-06-18 21:07:31

2

UPDATE

上解決了它:我是設置和從數據提供程序讀取當前的狀態。 和「正常」和「徘徊」總是基於當前狀態,因此當您將鼠標懸停在itemrenderer上時沒有任何更改。

<s:states> 
    <s:State name="normal" basedOn="{[email protected]}"/> 
    <s:State name="hovered" basedOn="{[email protected]}"/> 
    <s:State name="state1"/> 
    <s:State name="state2"/> 
</s:states> 

「我不知道你是什麼意思 」復位「。」

我在這裏有同樣的問題。 他希望在推出時保持狀態。這與風格無關。它只是關於國家。

我已經找到了這個,但我不能在我的建立中使用它。 http://ianserlin.com/index.php/2009/12/15/disabling-rollout-behavior-of-a-selected-item-in-a-flex-4-list/

0

感謝以下鏈接:

我發現這一點,但我不能夠在我的堆積來使用它。 http://ianserlin.com/index.php/2009/12/15/disabling-rollout-behavior-of-a-selected-item-in-a-flex-4-list/

我有類似的問題;基於數據我有兩種類型的正常狀態,鼠標移出後,我想讓渲染器識別要恢復的兩種狀態中的哪一種。我使用上述鏈接中給出的「覆蓋函數」解決方案來達到預期的效果。

我的解決方案:

  override protected function itemRenderer_rollOutHandler(event:MouseEvent):void { 
       if (data.index == 0) { 
        this.currentState = "keyNormal"; 
       } 
       else { 
        this.currentState = "normal"; 
       } 
      } 

我剛剛進入上面的代碼在我的定義ItemRenderer塊。

1

您可以通過挖掘ItemRenderer來源找到解決方案。搜索「推出」發現這一點:

private function addHandlers():void 
{ 
    addEventListener(MouseEvent.ROLL_OVER, itemRenderer_rollOverHandler); 
    addEventListener(MouseEvent.ROLL_OUT, itemRenderer_rollOutHandler); 
} 

綜觀「itemRenderer_rollOutHandler」的方法,它包含:

protected function itemRenderer_rollOutHandler(event:MouseEvent):void 
{ 
    hovered = false; 
} 

檢查出的「徘徊」的成員,你可以看到它有一個setter函數:

protected function set hovered(value:Boolean):void 
{ 
    if (value != _hovered) 
    { 
     _hovered = value; 
     setCurrentState(getCurrentRendererState(), playTransitions); 
     if (autoDrawBackground) 
     { 
      redrawRequested = true; 
      super.$invalidateDisplayList(); 
     } 
    } 
} 

這部分設置當前狀態。好處是它是一種受保護的方法,意味着我們可以覆蓋它。所以,如果你從來沒有在您的ItemRenderer使用懸停狀態,它足以把它添加到腳本塊:

override protected function set hovered(value:Boolean):void 
{ 
    // do nothing 
} 

懸停狀態和背景繪製不會發生,結果,所以部署事件監聽器將有沒有影響,你的狀態不會受到影響。

1

最簡單的解決方法是:

override protected function getCurrentRendererState():String 
{ 
    return currentState; 
} 

這樣的時候推出了或取消您的項目渲染器不會嘗試切換到它的「正常」狀態。 我使用它與驗證器一起設置渲染器的錯誤狀態。像魅力一樣工作。

0

ItemRenderers實際上將其選定的狀態委託給一個名爲InteractiveStateDetector的內部類,而不是父級列表。這可以通過在簡單的UI中簡單地使用ItemRenderer來驗證,並手動附加其數據(使用綁定到currentState值的標籤的make和itemRenderer是最簡單的方法)。你會看到它仍然根據當前的用戶體驗改變狀態。

考慮到這一點,Adobe精明地排除了任何禁用此功能的方法而不會讓人覺得混亂。但是,您可以像Dennis所建議的那樣執行,並覆蓋大多數用例的getCurrentRendererState函數。

我的特殊用例是我想在非呈現器設置中利用我的itemRenderer,只做了很小的狀態更改,但它沒有認識到我聲明瞭它的currentState爲「nonRenderer」。它會默認爲「正常」。