Проблемы с событиями itemRollOver и itemRollOut в компоненте List - PullRequest
2 голосов
/ 01 декабря 2008

Я установил прослушиватели событий itemRollOver и itemRollOut в компоненте List, но всякий раз, когда я наводю указатель мыши на элемент списка, события over и out одного и того же элемента списка последовательно запускаются сразу после друг друга. , В моем списке используется пользовательский itemRenderer.

Есть идеи, почему это может быть? Документация Adobe не дает большого представления об этом (неудивительно ...).

Ответы [ 6 ]

1 голос
/ 13 января 2009

На мой взгляд, это ошибка. ListBase.mouseOverHandler теперь устанавливает переменную с именем lastHighlightItemRendererAtIndices, когда он отправляет событие ITEM_ROLL_OVER, которое затем используется (вместе с lastHighlightItemIndices) при отправке события ITEM_ROLL_OUT в ListBase.clearHighlight * 100 *, вызываемого mouseOutH.

Проблема заключается в том, что при наведении мышки из строки в строку сначала вызывается mouseOverHandler, устанавливаются переменные lastHightlight ..., а затем, когда впоследствии вызывается mouseOutHandler, он использует значения lastHighlight ..., которые были просто в результате вы получаете последовательные события «переворачивания» и «разворачивания» для одного и того же средства визуализации.

Честно говоря, я не знаю, почему ListBase.clearHighlight просто не использует переданный в рендерере при отправке события ITEM_ROLL_OUT (как это было раньше для работы в SDK 2), так как это фактический рендерер, который "катится" из '.

0 голосов
/ 03 марта 2010

Спасибо за решение. Это действительно решило проблему! Небольшая коррекция, хотя:

listEvent.columnIndex = item.x;
listEvent.rowIndex = item.y;

должно быть

listEvent.columnIndex = pt.x;
listEvent.rowIndex = pt.y;

item.x и y содержат координаты рендерера в пикселях.

0 голосов
/ 24 июля 2009

У меня была такая же проблема. В итоге я создал подкласс класса mx.controls.List и переопределил функцию clearHighlight. Насколько я могу судить, переменная lastHighlightItemIndices читается только в этой функции. Таким образом, что-то вроде следующего решило эту проблему:

import mx.core.mx_internal;

use namespace mx_internal;

public class List extends mx.controls.List
{
    public function List()
    {
        super();
    }

    override mx_internal function clearHighlight( item:IListItemRenderer ):void
    {
        var uid:String = itemToUID( item.data );

        drawItem( UIDToItemRenderer( uid ), isItemSelected( item.data ), false, uid == caretUID );

        var pt:Point = itemRendererToIndices( item );

        if( pt )
        {
            var listEvent:ListEvent = new ListEvent( ListEvent.ITEM_ROLL_OUT );

            listEvent.columnIndex = item.x;
            listEvent.rowIndex = item.y;
            listEvent.itemRenderer = item;

            dispatchEvent( listEvent );
        }
    }
}

Тогда просто используйте этот класс List вместо Adobe, и вы получите ожидаемое поведение. Я протестировал это на Flex SDK 3.2, и он работает.

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:controls="com.example.controls.*">

    [ other code ... ]

    <controls:List itemRollOver="onItemRollOver( event )" itemRollOut="onItemRollOut( event )" />

</mx:Canvas>

Спасибо Джино Бассо за идею в посте выше. Надеюсь, это поможет.

0 голосов
/ 05 мая 2009

Была такая же проблема. super.data уже был установлен, и элемент одинаков для событий rollOut и rollOver. В итоге я выбрал худший сценарий anirudhsasikumar и прослушал rollOver и rollOut внутри средства визуализации элементов. Кажется, работает нормально.

0 голосов
/ 13 января 2009

Убедитесь, что вы устанавливаете super.data в вашем средстве визуализации элементов, если вы переопределяете набор данных ().

ListBase прослушивает MOUSE_OVER, а затем вычисляет элемент под ним на основе координат мыши и положения средства визуализации элемента. Вы можете проверить ListEvent.itemRenderer, чтобы увидеть, какие рендеринг переворачивается и разворачивается и в каком порядке.

В худшем случае вы можете прослушивать rollOver и rollOut внутри средства визуализации.

0 голосов
/ 01 декабря 2008

Они приходят от одного и того же объекта? Если нет, то, скорее всего, вы получите itemRollOut из «элемента», который вы только что оставили, и itemRollOver из нового, который вы ввели, в зависимости от расстояния между ними, и они могут сработать очень близко друг к другу.

...