Как найти элемент списка в данный момент под указателем мыши во Flex? - PullRequest
1 голос
/ 03 февраля 2010

У меня есть несколько элементов управления List и TileList. Как я могу получить ссылку на элемент списка, который в данный момент находится под указателем мыши?

Ответы [ 3 ]

4 голосов
/ 03 февраля 2010

добавьте прослушиватель событий для каждого элемента в вашем списке для mouseOver, тогда в вашей функции это будет event.currentTarget

2 голосов
/ 05 февраля 2010

Спасибо за ответы до сих пор. В конце концов я придумал что-то другое и подумал, что поделюсь этим. Основная причина, по которой я выбрал это решение, заключается в том, что я на самом деле реагирую на внешнее событие, поскольку я использую библиотеку пользовательского контекстного меню для захвата щелчка правой кнопкой мыши в JavaScript. Когда происходит щелчок правой кнопкой мыши, пользователь не обязательно двигает мышь. Я мог отслеживать, над каким пунктом указатель находится постоянно, но я думал, что это будет сложно. Как бы то ни было, мое решение работало путем подкласса List, что-то вроде:

package components{
    import mx.controls.List
    use namespace mx_internal

    public class MyList extends List{

        public function findItemIndexForMouse(stageX:Number, stageY:Number):Number{
            var item
            var pt:Point = new Point(stageX, stageY)
            pt = listContent.globalToLocal(pt)
            var rc:int = listItems.length
            for (var i:int = 0; i < rc; i++)
            {
                if (rowInfo[i].y <= pt.y && pt.y < rowInfo[i].y + rowInfo[i].height)
                {
                    item = listItems[i][0]
                    break
                }
            }
            return itemRendererToIndex(item)
        }
    }
}

Теперь вы можете вызвать list.findItemIndexForMouse (), чтобы получить индекс элемента с учетом координат этапа мыши. Убедитесь, что вы используете пространство имен mx_internal, иначе у вас не будет доступа к некоторым обязательным переменным экземпляра. Для TileList вы должны сделать то же самое, за исключением того, что метод выглядит немного иначе:

public function findItemIndexForMouse(stageX:Number, stageY:Number):Number{
    var item
    var pt:Point = new Point(stageX, stageY)
    pt = listContent.globalToLocal(pt)
    var rc:int = listItems.length;
    for (var i:int = 0; i < rc; i++)
    {
        if (rowInfo[i].y <= pt.y && pt.y < rowInfo[i].y + rowInfo[i].height)
        {
            var cc:int = listItems[i].length;
            for (var j:int = 0; j < cc; j++)
            {
                if (listItems[i][j] && listItems[i][j].x <= pt.x
                    && pt.x < listItems[i][j].x + listItems[i][j].width)
                {
                    item = listItems[i][j];
                    if (!DisplayObject(item).visible)
                        item = null;
                    break;
                }
            }
            break;
        }
    }
    return itemRendererToIndex(item)

}
2 голосов
/ 04 февраля 2010

В List / TileList для Flex 3 есть простой способ сделать это:

<mx:TileList id="tileList" itemRollOver="{trace('found item ' + event.itemRenderer)}"/>

ListEvent.ITEM_ROLL_OVER также имеет множество полезных свойств:

  • event.itemRenderer
  • event.rowIndex
  • event.columnIndex

Вы можете получить пролонгированные данные через event.itemRenderer.data, а отобранный индекс оттуда с помощью tileList.dataProvider.getItemIndex(event.itemRenderer.data)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...