Спасибо за ответы до сих пор. В конце концов я придумал что-то другое и подумал, что поделюсь этим. Основная причина, по которой я выбрал это решение, заключается в том, что я на самом деле реагирую на внешнее событие, поскольку я использую библиотеку пользовательского контекстного меню для захвата щелчка правой кнопкой мыши в 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)
}