Actionscript 3 覆盖仅为一个组件获取宽度或高度-Flex Mobile
只是我想做的一点背景知识。我有一个自定义皮肤,其中有一个可设置样式的文本字段来显示日期。单击绑定到日期的可设置样式的文本字段时,会出现日期微调器。在datespinner的后面,我画了一个精灵,它需要覆盖整个屏幕,这样我就可以检测到点击并使datespinner消失 现在问题来了- 没有覆盖“获取宽度”或“获取高度”,我无法填充整个屏幕。但是,当我这样做时,datespinner会中断,因为它从覆盖中获取高度。只是想知道是否有人知道只覆盖一个组件并将所有其他组件设置为其默认值的方法。我知道这可能看起来像一个noob问题,也许我遗漏了一些明显的东西,我对as3基本上是新手 这里有一些代码-Actionscript 3 覆盖仅为一个组件获取宽度或高度-Flex Mobile,actionscript-3,overriding,skinning,Actionscript 3,Overriding,Skinning,只是我想做的一点背景知识。我有一个自定义皮肤,其中有一个可设置样式的文本字段来显示日期。单击绑定到日期的可设置样式的文本字段时,会出现日期微调器。在datespinner的后面,我画了一个精灵,它需要覆盖整个屏幕,这样我就可以检测到点击并使datespinner消失 现在问题来了- 没有覆盖“获取宽度”或“获取高度”,我无法填充整个屏幕。但是,当我这样做时,datespinner会中断,因为它从覆盖中获取高度。只是想知道是否有人知道只覆盖一个组件并将所有其他组件设置为其默认值的方法。我知道这可能
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;
}
代码不完整,但只是为了让大家了解我的观点。谢谢你的阅读和帮助
编辑-
我知道怎么做了。添加一些信息以防有人遇到同样的问题-
Flex将sprite(或任何UI组件)的大小限制为容器的大小。如果您试图检查容器的大小,它只返回容器的大小。在我的代码中-
override public function get width () : Number {
return _width;
}
override public function get height () : Number {
return _height;
}
这通常被吹捧为超过容器大小的修复。然而,这种方法是有缺陷的,因为它覆盖了所有要求宽度和高度的内容。在这种情况下,它试图使所有东西都具有高度和宽度的大小。对于任何有超过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);
}
希望我为某人节省了几个小时的工作:)您发布的代码不太清楚,但也许您应该覆盖
updateDisplayList()
方法,而不是width
和height
updateDisplayList()
是组件实现的用于调整其子对象大小和位置的Flex生命周期方法
updateDisplayList()
由Flex框架调用,它传入两个值:unscaledWidth
和unscaledHeight
。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
}
谢谢你的帮助,让我看一看,已经覆盖了updateDisplayList。我试着让雪碧比容器大,如果有意义的话,其他的东西都保持同样的大小。但我认为你可能已经让我走上了正确的道路,GetPreferredBoundWidth,Height。。