Отключение itemrenderer Hovered State - PullRequest
0 голосов
/ 18 июня 2010

Мой itemrenderer имеет 2 пользовательских состояния, нет состояния наведения и нормального состояния

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

Когда я инициализирую его, я заставляю его перейти к state2. Проблема в том, что когда мышь rolls out отходит от предмета, она возвращается в первое состояние state1. Это немного странно, так как у меня нет состояния зависания / неведения. Кто-нибудь знает, как этого избежать? может быть, как-то отключив эффект rollout?

Ответы [ 6 ]

2 голосов
/ 22 ноября 2010

ОБНОВЛЕНИЕ

, которое решило это для меня: я устанавливаю и читаю текущее состояние из провайдера данных.и «нормальный» и «зависший» всегда основаны на текущем состоянии, поэтому при наведении курсора на элемент ничего не меняется.

<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 голос
/ 16 ноября 2011

Самое простое решение:

override protected function getCurrentRendererState():String
{
    return currentState;
}

Таким образом, при развертывании или отмене выбора средство визуализации элементов не будет пытаться переключиться в «нормальное» состояние.Я использовал его вместе с валидаторами, чтобы установить состояние ошибки рендерера.Работал как шарм.

1 голос
/ 23 августа 2011

Вы можете найти решение, покопавшись в источнике 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;
}

Извлекая член "hovered", вы можете видеть, что онимеет функцию установки:

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
}

В результате состояние наведения и фоновый рисунок не произойдут, поэтому слушатель события свитка развертыванияне будет иметь никакого эффекта, и ваши состояния не будут затронуты.

0 голосов
/ 20 марта 2012

ItemRenderers фактически делегируют свои нормальные, парящие и выбранные состояния внутреннему классу с именем InteractiveStateDetector, а не родительскому списку. Это можно проверить, просто используя ItemRenderer в простом пользовательском интерфейсе и вручную прикрепляя его данные (make и itemRenderer с меткой, привязанной к значению currentState, - самый простой способ увидеть это). Вы увидите, что он все еще меняет состояние в зависимости от текущего UX.

Имея это в виду, Adobe блестяще упустила любые средства, чтобы отключить это без проблем. Однако вы можете сделать, как предлагает Деннис, и переопределить функцию getCurrentRendererState для большинства случаев использования.

Мой конкретный вариант использования состоял в том, что я хотел использовать мой itemRenderer в настройках без рендеринга с незначительными изменениями состояния, но он не распознал, что я объявил его currentState как «nonRenderer». По умолчанию будет "нормальный".

0 голосов
/ 22 июня 2011

Спасибо за следующую ссылку:

Я нашел это, но не могу использовать его в моей сборке.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.

0 голосов
/ 18 июня 2010

Я хотел бы заняться чем-нибудь с событиями мыши, такими как MouseOver

http://docs.huihoo.com/flex/4/flash/display/InteractiveObject.html#event:mouseOver

Тем не менее, я уверен, что когда вы используете что-то в качестве itemRenderer,Класс list может осуществлять некоторый контроль над itemRenderer.Вполне возможно, что класс List вызывает поведение, которое вы видите.Какой класс вы используете?Кто ваш рендерер?

...