2012-08-28 49 views
0

我已將子類LabelItemRenderer類爲我的移動應用程序中的火花列表創建可展開的呈現器。減少可調整大小的生命週期驗證調用Flex LabelItemRenderer

當用戶選擇一個項目時,渲染器的大小增加,顯示附加數據。渲染器基本上看起來像這樣(我已經刪除了這裏不重要的部分,所以這基本上是僞代碼)。

public class PositionsGridRenderer extends LabelItemRenderer 
{ 
    public function PositionsGridRenderer() { 
     super(); 
     addEventListener(MouseEvent.CLICK, expandHandler); 
    } 

    protected override function createChildren():void { 
     super.createChildren(); 

     _dg = new DataGroup(); 
     _dg.visible = false; 
     addChild(_dg); 
    } 

    private function expandHandler(event:Event):void { 
     if(_gridVisible) { 
      if(!_detailClicked) { 
       _dg.visible = false; 
       _gridVisible = false; 
      } 
      _detailClicked = false; 
     } else { 
      _dg.visible = true; 
      _gridVisible = true; 
     } 
    } 

    public override function set data(value:Object):void { 
     if(!value) return; 

     super.data = value; 

     var pos:Position = data as Position; 

     label = pos.positionName; 
     _dg.dataProvider = pos.positionSymbols; 
    } 

    protected override function measure():void { 
     !_gridVisible ? measuredHeight = 30 : measuredHeight = 30 + getElementPreferredHeight(_dg); 
     this.height = measuredHeight; 
    } 

    protected override function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void { 
     setElementSize(labelDisplay, unscaledWidth, 30); 
     setElementPosition(labelDisplay, 10,10); 
     if(_gridVisible) { 
      setElementSize(_dg, unscaledWidth, getElementPreferredHeight(_dg)); 
      setElementPosition(_dg, 0, 30); 

     } else { 
      setElementSize(_dg, unscaledWidth, 0); 
     } 

     invalidateSize(); 
    } 
} 

}

按預期工作,我只是想知道是否有減少的驗證量的方式調用,當我展開它渲染器做。 如果點擊展開,layoutContentsmeasure函數都按以下順序調用三次:layoutcontents - > measure,layoutcontens - > measure,layoutcontents - > measure。

我明白他們被稱爲一次,因爲我無效的大小,但三次似乎很奇怪。 有誰知道這是爲什麼發生,或者甚至如何防止這種情況發生?

+0

我不清楚如何從您的帖子調整渲染器。它是否像一個窗口,用戶點擊並拖動來設置一些新的尺寸?或者,它是一個固定的選項,通過點擊一個按鈕在兩種不同的尺寸之間切換? – JeffryHouser

+0

它是固定的。查看渲染器的初始大小爲30.查看'measure()'函數。當網格(要顯示的可選數據)不可見時,呈現器的大小保持爲30.當顯示網格時(由expandHandler()函數切換),呈現器的大小增加到初始大小(30)加上網格的首選高度。 – AlBirdie

+0

我知道你說過這是僞代碼;但不應該在被保護之前的'覆蓋',而不是之後? 「超級」被稱爲layoutContents和/或措施?如果在layoutContents中使用invalidateSize(),那麼每次組件重繪時都不會觸發新的驗證週期?很多交互可以invalidateDisplayList();但我沒有看到它是你手動做的,所以我不清楚是什麼導致它。 – JeffryHouser

回答

1

真正的問題是爲什麼組件要經歷三個完整的渲染器循環?經過一番討論後,我們遇到了這種情況:

  1. 第一次觸發無效循環是鼠標關閉或可能發生觸摸開始事件時。這使組件進入懸停狀態;這導致組件中的視覺改變。
  2. 第二次觸發無效循環是選擇項目時。這使渲染器處於關閉狀態;導致繪製不同的視覺指示符。
  3. 第三個無效週期由組件自己的代碼引起; layoutContents()調用invalidatesize()