Apache flex 如何查找用作弹出窗口的动态flex组件的高度
我已经创建了一个自定义组件,其中包含几个内联项渲染器,我将它们用作工具提示。组件的高度未知,因为组件的数据内容直到运行时才知道 但是,当显示工具提示时,它偶尔会超出flash应用程序的边界,因此,我希望能够检测到这种情况并重新定位提示 问题是组件的高度和宽度显然在弹出式管理器渲染之前不可用。(即,它们始终为0) 但是,我不知道有什么方法可以确定弹出窗口实际渲染的时间以及可用的高度/宽度值 我尝试将调整大小事件侦听器添加到组件中,但它似乎不起作用,尽管我很确定可能是做错了什么,因为在我看来,调整大小事件只提供对象的“oldWidth”和“oldHeight”,在第一次显示时,它将是0…对我来说毫无用处 关于如何进行有什么想法吗 -----编辑----- 我有这样一个基类:Apache flex 如何查找用作弹出窗口的动态flex组件的高度,apache-flex,actionscript-3,flex4,flash-builder,flex4.5,Apache Flex,Actionscript 3,Flex4,Flash Builder,Flex4.5,我已经创建了一个自定义组件,其中包含几个内联项渲染器,我将它们用作工具提示。组件的高度未知,因为组件的数据内容直到运行时才知道 但是,当显示工具提示时,它偶尔会超出flash应用程序的边界,因此,我希望能够检测到这种情况并重新定位提示 问题是组件的高度和宽度显然在弹出式管理器渲染之前不可用。(即,它们始终为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;
然后,像这样的扩展渲染器:
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);
}
}
请注意,此附加代码没有绑定到任何组件变量,它只是在组件属性上添加了一个观察者。用于显示在itemRenderer中使用的控件的工具提示?文本或标签?尝试侦听该组件的更新完成事件。这对你有帮助吗 您也可以尝试绑定宽度和高度。如果这些在你的类中是可绑定的,flex会自动调整弹出窗口的宽度和高度 当使用mxml进行绑定时,您可以这样做
<mx:YourComponent height="{HeightOfYourTooltip}" width="{WidthOfYourTooltip}"></mx:YourComponent>
[Bindable]
var myVariable:SomeVariable;
如果您希望监视其他变量或属性的更改,请确保在类中的变量上方添加[Bindable]-标记,如下所示
<mx:YourComponent height="{HeightOfYourTooltip}" width="{WidthOfYourTooltip}"></mx:YourComponent>
[Bindable]
var myVariable:SomeVariable;
我希望这会有所帮助。这可能会很混乱,但在弹出组件上,您可以在触发complete后添加一个事件侦听器,如果高度或宽度
==0
,那么您可以在100ms后将timeout()设置为函数,直到获得有效数据
是的,我知道这是一个有点黑客,但这些最终将报告正确的测量值,所以它不会调用那么多次
如果你反对截止日期或类似的事情,这只是一个想法并不重要。:) 这是一个标签。实际上,这是一系列的标签和两个列表。直到运行时我才知道高度的原因是因为数据被插入到列表中。所以你有两个列表,其中一个是渲染器标签。它是?要查找列表的高度还是单个标签的高度?Heyy Checkout this>>我有一个复杂的渲染器,其中包含大约25个标签和2个大小不确定的列表,所有这些都放在一个组件中。我正在寻找整个组件的高度。我不确定我是否理解。密码。这是个好主意,但没用。在该事件处理程序中,高度仍然报告为0。popupmanager处理东西的方式一定很奇怪。还有其他想法吗?我不确定这种方法是否可行,因为我没有设置组件的高度——它是在运行时确定的。在不知道如何初始化变量的情况下,如何将变量绑定到高度?绑定会自动更新。如果您提供一些关于如何准确调用组件以及如何构建组件的代码,我可以提供关于如何实现绑定的更多详细信息。请大家注意,我对ChangeWatcher进行了一些研究,您实际上不必绑定变量来使用它。查看问题中的最新编辑,了解我是如何解决此问题的。您不必绑定组件的高度,因为默认情况下高度是可绑定的。如果要创建自己的自定义变量,您必须使这些可绑定:)很高兴您能够使用changewatcher解决问题。另一个想法是在init上创建每种类型中的一种,并在适当时填充和显示,而不是根据需要创建和销毁它们-实际上可能是相同的内存,具体取决于有多少类型(因为闪存会占用内存,只在需要时收集)而且cpu肯定更少。实际上,让其中一个驻留在内存中并按需移动数据要比每次从头开始创建数据快得多。它会根据列表的新大小自动调整自身大小吗?可能是invalidateSize()可以吗?另外,我喜欢你的想法,尽管我正在努力避免添加黑客。我已经指定了一个“显示”区域,并且每次都在相同的位置显示提示,直到我(或我们:D)找到一个合适的解决方案。只是尝试在内存中保留一个工具提示,它可以完美地工作,并在绑定新数据时自动调整组件的大小。好主意!这实际上是一个更好的解决方案,我自己为出现的工具提示/注释做了这件事。很高兴它为您解决了:)