2012-10-19 65 views
3

只是我想要做的一點背景。我有一個自定義皮膚,我有一個可調整的文本字段來顯示日期。當點擊綁定到日期的可編輯文本字段時,會出現日期微調器。在datespinner後面,我繪製了一個精靈,它需要覆蓋整個屏幕,以便我可以檢測到一個點擊並使datepinner消失。覆蓋只有一個組件的寬度或高度 - Flex Mobile

現在problem-

沒有覆蓋的get寬度或高度得到我一直沒能填滿整個屏幕。但是,當我這樣做時,日期打印機因爲從覆蓋中獲得高度而中斷。只是想知道是否有人知道一種方法來覆蓋只有一個組件並將所有其他組件設置爲它們的默認值。我知道這可能看起來像一個noob問題,也許我錯過了明顯的東西,我大多是新來的as3。

下面是一些代碼 -

override protected function createChildren():void { 
     super.createChildren(); 
      if(!img) { 
       img = new dateButtonBG(); 
       addChild(img); 
      } 

      if (!maskSprite) { 
       maskSprite = new Sprite(); 
       maskSprite.graphics.beginFill(0xFFFFCC, .5); 
       maskSprite.graphics.drawRect(-((stage.height)/2),-((stage.width)/2), stage.width, stage.height); 
       maskSprite.graphics.endFill(); 
      } 

if(!dateButton) { 
       dateButton = new StyleableTextField(); 
       todayDate = new Date(); 
       BindingUtils.bindProperty(dateButton, "text", date, "selectedDate"); 
       dateButton.addEventListener(MouseEvent.CLICK, onDateButtonClick); 
       addChild(dateButton); 
      } 
invalidateDisplayList(); 
} 

protected function removeSpinner(event:Event):void{ 
      maskSprite.removeEventListener(MouseEvent.CLICK, removeSpinner); 
      removeChild(date); 
      removeChild(maskSprite); 
     } 

protected function onDateButtonClick (event:Event):void { 
      addChild(maskSprite); 
      addChild(date); 
      maskSprite.addEventListener(MouseEvent.CLICK, removeSpinner); 
     } 

override public function get width() : Number { 
      return _width; 
     } 

override public function get height() : Number { 
      return _height; 
     } 

的代碼是不完整的,但僅僅是整個讓我點。感謝您的閱讀和所有的幫助。

EDIT- 我想出瞭如何做到這一點。在某些人遇到同樣問題的情況下添加一些信息 - Flex容器限制了精靈(或任何UI組件)的大小。如果您嘗試查看容器的大小,它只會返回容器的大小。在我的代碼中 -

override public function get width() : Number { 
      return _width; 
     } 

override public function get height() : Number { 
      return _height; 
     } 

這通常被吹捧爲超過容器大小的修復。這種方法存在缺陷,因爲它覆蓋了所有要求寬度和高度的東西。在這種情況下,它會嘗試使_height和_width的大小一致。對於任何有超過1個組件的皮膚來說,這是一個巨大的問題,要麼你可以嘗試單獨設置物品的尺寸,這對於我來說不起作用或者找不到替代方法。 這裏是工程─

public override function validateDisplayList():void { 
      super.validateDisplayList(); 
      yourComponent.width = someConstantW; 
      yourComponent.height = someConstantH; 
     } 

這不會然而,是不夠的。您可能需要在容器外移到你的組件此試戴

override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void { 
       super.layoutContents(unscaledWidth, unscaledHeight); 
       setElementPosition(yourComponent, x, y); 
      } 

希望我救了別人的工作:)

回答

0

這不是從代碼很清楚你已經張貼了幾個小時,但也許你應該重寫updateDisplayList()方法而不是widthheight

updateDisplayList()是組件實現大小和定位其子對象的Flex生命週期方法。

updateDisplayList()由Flex框架調用,它傳遞兩個值:unscaledWidthunscaledHeight。你的暗示updateDisplayList()應該尊重這些價值觀,並相應地確定孩子對象的大小/位置。您應該使用其他生命週期方法(如下所示)來進行實際的大小/定位。

下面是一個示例實現,以幫助您入門。它可能會有一點點,因爲我不完全理解你提供的代碼片段。

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void 
{ 
    super.updateDisplayList(unscaledWidth, unscaledHeight); 
    // size/position the background (or whatever it is that should occupy the whole screen) 
    background.setLayoutBoundsPosition(0,0); // unnecessary because 0,0 is default 
    background.setLayoutBoundsSize(unscaledWidth, unscaledHeight); 
    // size/position the text in the center 
    var textWidth:Number = text.getPreferredBoundsWidth; 
    var textheight:Number = text.getPreferredBoundsHeight 
    text.setLayoutBoundsPosition((unscaledWidth - textWidth)/2, (unscaledHeight - textHeight)/2); 
    text.setLayoutBoundsSize(textWidth, textHeight); // probably not necessary 

} 
+0

感謝您的幫助讓我環顧一下,已經覆蓋了updateDisplayList。我試圖讓這個精靈比容器更大,如果這有什麼意義,讓所有其他東西保持相同的大小。但我認爲你可能已經把我放在正確的道路上getPrefferredBoundWidth,Height .. – apaul