UIComponent中是否有一个方法可以告诉状态发生变化?

时间:2016-10-30 06:01:54

标签: flash flex flex4

我正在使用自定义组件,我需要能够判断状态何时发生变化。

StateChangeEvent.CURRENT_STATE_CHANGE添加事件监听器是监听状态更改的唯一方法,还是有可以覆盖的方法?

public function MyComponent() extends SkinnableComponent {

    public function MyComponent() {
        addEventListener(StateChangeEvent.CURRENT_STATE_CHANGE, onCurrentStateChange);
    }

    private function onCurrentStateChange(event:StateChangeEvent):void {
        //invalidateSkinState();
    }
}

我查看了UIComponent.commitCurrentState()(调度事件的地方),并将其标记为私有。

2 个答案:

答案 0 :(得分:1)

您可以覆盖:

protected function stateChanged(oldState:String, newState:String, recursive:Boolean):void

您还有其他活动,例如enterState

  

在组件进入视图状态后调度。

stateChangeComplete

  

在组件进入新状态和任何状态后调度   过渡动画到该状态已经完成播放。活动是   如果之间没有过渡,则立即派遣   状态。如果组件切换到不同的状态而   过渡期正在进行中,此事件将在之后发送   组件完成向新状态的转换。

答案 1 :(得分:0)

看起来有一个UIComponent.stageChanged()方法可以扩展:

  

当状态改变以检查是否时调用此方法   特定于州的样式适用于此组件。如果有机会的话   一个匹配的CSS伪选择器,用于当前状态,样式   需要为此实例重新生成缓存,并且可能全部重新生成缓存   子项,如果recursive参数设置为true

AS:

protected function stateChanged(oldState:String, newState:String, recursive:Boolean):void
{
    // This test only checks for pseudo conditions on the subject of the selector.
    // Pseudo conditions on ancestor selectors are not detected - eg:
    //    List ScrollBar:inactive #track
    // The track styles will not change when the scrollbar is in the inactive state.
    if (currentCSSState && oldState != newState &&
           (styleManager.hasPseudoCondition(oldState) ||
            styleManager.hasPseudoCondition(newState)))
    {
        regenerateStyleCache(recursive);
        initThemeColor();
        styleChanged(null);
        notifyStyleChangeInChildren(null, recursive);
    }
}