我的itemrenderer有2个自定义状态,没有悬停状态,没有正常状态
<s:states>
<s:State name="state1" />
<s:State name="state2" />
</s:states>
初始化时,我强制它转到state2
。问题是当鼠标rolls out
远离项目时,它会重新回到第一个状态state1
。这有点奇怪,因为我没有真正的悬停/徘徊状态。任何人都知道如何防止这种情况发生?也许通过某种方式禁用rollout
效果?
答案 0 :(得分:2)
的更新强> 的
为我解决了这个问题:我正在设置并从数据提供者中读取当前状态。 并且“正常”和“悬停”总是基于当前状态,因此当您将鼠标悬停在itemrenderer上时没有任何变化。
<s:states>
<s:State name="normal" basedOn="{data.@state}"/>
<s:State name="hovered" basedOn="{data.@state}"/>
<s:State name="state1"/>
<s:State name="state2"/>
</s:states>
“我不确定你的意思是”重置“。”
我在这里遇到同样的问题。 他希望在推出时保持状态。这与款式无关。它只是关于各州。
我找到了这个,但我无法在我的构建中使用它。 http://ianserlin.com/index.php/2009/12/15/disabling-rollout-behavior-of-a-selected-item-in-a-flex-4-list/
答案 1 :(得分:1)
您可以通过深入了解ItemRenderer源找到解决方案。搜索“rollout”会发现:
private function addHandlers():void
{
addEventListener(MouseEvent.ROLL_OVER, itemRenderer_rollOverHandler);
addEventListener(MouseEvent.ROLL_OUT, itemRenderer_rollOutHandler);
}
查看“itemRenderer_rollOutHandler”方法,它包含:
protected function itemRenderer_rollOutHandler(event:MouseEvent):void
{
hovered = false;
}
检查“悬停”成员,你会发现它有一个setter函数:
protected function set hovered(value:Boolean):void
{
if (value != _hovered)
{
_hovered = value;
setCurrentState(getCurrentRendererState(), playTransitions);
if (autoDrawBackground)
{
redrawRequested = true;
super.$invalidateDisplayList();
}
}
}
部分内容设定当前状态。好处是它是一种受保护的方法,这意味着我们可以覆盖它。因此,如果您从未在ItemRenderer中使用悬停状态,则将其添加到脚本块就足够了:
override protected function set hovered(value:Boolean):void
{
// do nothing
}
悬停状态和背景绘图不会因此而发生,因此rollout事件侦听器将不起作用,并且您的状态不会受到影响。
答案 2 :(得分:1)
最简单的解决方案是:
override protected function getCurrentRendererState():String
{
return currentState;
}
这种方式在推出或取消选择时,您的项目渲染器不会尝试切换到“正常”状态。 我与Validators一起使用它来设置渲染器的错误状态。工作就像一个魅力。
答案 3 :(得分:0)
我会研究鼠标事件,例如MouseOver
http://docs.huihoo.com/flex/4/flash/display/InteractiveObject.html#event:mouseOver
但是,我很确定当你使用某些东西作为itemRenderer时,list类可以对itemRenderer施加一些控制。 List类完全有可能导致您看到的行为。你在上什么课?你的渲染器是什么?
答案 4 :(得分:0)
感谢以下链接:
我找到了这个,但我无法在我的构建中使用它。 http://ianserlin.com/index.php/2009/12/15/disabling-rollout-behavior-of-a-selected-item-in-a-flex-4-list/
我有类似的问题;基于数据,我有两种类型的正常状态,在鼠标输出后,我希望渲染器识别要恢复的两种状态中的哪一种。我使用上面链接中给出的“覆盖功能”解决方案来实现所需的效果。
我的解决方案:
override protected function itemRenderer_rollOutHandler(event:MouseEvent):void {
if (data.index == 0) {
this.currentState = "keyNormal";
}
else {
this.currentState = "normal";
}
}
我刚刚在自定义ItemRenderer的块中输入了上面的代码。
答案 5 :(得分:0)
ItemRenderers实际上委托他们的正常,悬停&amp;选择状态到名为InteractiveStateDetector的内部类,而不是父列表。这可以通过在简单的UI中简单地使用ItemRenderer并手动附加其数据来验证(make和itemRenderer以及绑定到currentState值的标签是查看此内容的最简单方法)。您将看到它仍然根据当前的UX更改状态。
考虑到这一点,Adobe出色地遗漏了任何禁用此功能的方法而不会弄乱。但是你可以像丹尼斯建议的那样做,并覆盖大多数用例的getCurrentRendererState函数。
我的特殊用例是我想在非渲染器设置中利用我的itemRenderer,只有很小的状态更改,但它没有认识到我将其currentState声明为“nonRenderer”。它将默认为“正常”。