代码之家  ›  专栏  ›  技术社区  ›  airportyh

如何在flex中查找鼠标指针下当前的列表项?

  •  1
  • airportyh  · 技术社区  · 15 年前

    我有一些列表和tilleist控件。如何获取对鼠标指针下当前列表项的引用?

    3 回复  |  直到 15 年前
        1
  •  4
  •   invertedSpear    15 年前

    为mouseover向列表中的每个项目添加一个事件侦听器,然后在函数中它将是event.currentTarget

        2
  •  2
  •   Lance Pollard    15 年前

    对于flex 3,list/tillelist中有一个简单的方法可以做到这一点:

    <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)

        3
  •  2
  •   airportyh    15 年前

    谢谢你的回答。我最终想出了一些不同的想法,我想我也会分享。我选择此解决方案的主要原因是因为我实际上在响应外部事件,因为我使用 custom context menu 库以捕获在javascript中的右键单击。当发生右键单击时,用户可能不必移动鼠标。我可以随时跟踪指针指向哪个项目,但我认为这会变得复杂。不管怎样,我的解决方案是通过子类化列表来工作的,比如:

    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.finditMindexFormouse()来获取给定鼠标阶段坐标的项的索引。确保使用mx_内部命名空间,否则将无法访问某些必需的实例变量。对于TilleList,您必须执行相同的操作,除了方法看起来有点不同:

    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)
    
    }
    
    推荐文章