禁用itemrenderer悬停状态

时间:2010-06-18 04:13:46

标签: flex actionscript-3 adobe mxml

我的itemrenderer有2个自定义状态,没有悬停状态,没有正常状态

<s:states>
    <s:State name="state1" />
    <s:State name="state2" />
</s:states>

初始化时,我强制它转到state2。问题是当鼠标rolls out远离项目时,它会重新回到第一个状态state1。这有点奇怪,因为我没有真正的悬停/徘徊状态。任何人都知道如何防止这种情况发生?也许通过某种方式禁用rollout效果?

6 个答案:

答案 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”。它将默认为“正常”。