我创建了一个自定义组件,其中包含几个用作工具提示的内联项呈现器。组件的高度是未知的,因为组件的数据内容直到运行时才知道。
但是,在显示工具提示时,有时它会超出 Flash 应用程序的边界,因此,我希望能够检测到这种情况并重新定位提示。
问题是组件的高度和宽度显然在被弹出管理器呈现之后才可用。(即它们始终为 0)
但是,我不知道有什么方法可以找出实际呈现弹出窗口的时间,因此不知道可用的高度/宽度值。
我尝试向组件添加一个调整大小事件侦听器,但它似乎不起作用,尽管我肯定做错了什么,因为在我看来调整大小事件只给你“oldWidth”和“oldHeight”该对象在第一次显示时将为 0 ......对我来说毫无用处。
关于如何进行的任何想法?
------编辑----- 我有一个这样的基类:
public class TTComponent extends Canvas
{
var _parentC:UIComponent;
var popped:Boolean = false;
var timer:Timer;
var _comp:UIComponent;
public function set parentComponent(pC:UIComponent):void
{
_parentC = pc;
_parentC.addEventListener(MouseEvent.MOUSE_OUT, mouseOut);
_parentC.addEventListener(MouseEvent.MOUSE_OVER, mouseOver);
}
public function mouseOver(evt:MouseEvent):void
{
if (_parentC != null)
{
timer = new Timer(150,1);
_comp = this;
timer.addEventListener(TimerEvent.TIMER_COMPLETE, function( tevt:TimerEvent ):void
{
this.move( somex, somey);
if (popped != true)
{
PopUpManager.addPopUp(_comp, parentComponent );
popped = true;
});
timer.start();
}
}
public function mouseOut(evt:MouseEvent ):void
{
if ( timer )
{
timer.stop();
timer = null;
}
//If we popped up, remove the popup
if ( popped )
{
PopUpManager.removePopUp( _comp );
popped = false;
parentC .removeEventListener(MouseEvent.MOUSE_OUT, mouseOut);
parentC .removeEventListener(MouseEvent.MOUSE_OVER, mouseOver);
}
}
}
然后,像这样的扩展渲染器:
<c:TTComponent name="T" xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:c="components.*">
<s:BorderContainer>
...about 30 labels grouped in various manners
...2 lists with inline item renderers
</s:BorderContainer>
</c:TTComponent>
现在,代码是这样调用的:
var w = new TTComponent();
w.data = data;
win.parentComponent = this;
这将向父级上的鼠标悬停和鼠标移出事件添加侦听器,无论它是什么,然后相应地显示或隐藏工具提示。
- - - 编辑 - - -
使用下面评论者建议的部分内容,这是我提出的解决方案:
在 TTComponent 类内部:
import flash.events.Event;
import mx.binding.utils.ChangeWatcher;
private var heightWatcher:ChangeWatcher;
public function set parentComponent
{
...
heightWatcher = ChangeWatcher.watch(this,'height',onSizeChange);
}
public function onSizeChange(evt:Event):void
{
if (this.height != 0)
{
....calculate the new component coords
this.move(newx, newy);
}
}
请注意,此附加代码不会绑定到任何组件变量,它只是在组件属性上添加了一个观察者。