Apache flex 列表组件上的itemRollOver和itemRollOut事件存在问题
我已经在列表组件上设置了Apache flex 列表组件上的itemRollOver和itemRollOut事件存在问题,apache-flex,events,flex3,adobe,Apache Flex,Events,Flex3,Adobe,我已经在列表组件上设置了itemRollOver和itemRollOut事件侦听器,但每当我将鼠标滚动到列表项上时,同一列表项的over和out事件都会紧接着相继触发。我的列表使用自定义itemRenderer 你知道为什么会这样吗?Adobe文档对此没有提供太多的见解(毫不奇怪……。它们来自同一个对象吗? 如果不是,则可能会从您刚刚离开的“项目”中获得一个项目卷展栏,并从您输入的新项目中获得一个项目卷展栏,这取决于它们的间距,并且这些项目可能彼此非常接近 如果覆盖set data(),请确保在
itemRollOver
和itemRollOut
事件侦听器,但每当我将鼠标滚动到列表项上时,同一列表项的over和out事件都会紧接着相继触发。我的列表使用自定义itemRenderer
你知道为什么会这样吗?Adobe文档对此没有提供太多的见解(毫不奇怪……。它们来自同一个对象吗?
如果不是,则可能会从您刚刚离开的“项目”中获得一个项目卷展栏,并从您输入的新项目中获得一个项目卷展栏,这取决于它们的间距,并且这些项目可能彼此非常接近 如果覆盖set data(),请确保在项目渲染器中设置了super.data ListBase侦听鼠标悬停,然后根据鼠标坐标和项目渲染器的位置找出它下面的项目。您可以检查ListEvent.itemRenderer以查看哪个渲染器的“翻转”和“转出”正在启动,以及启动的顺序
最糟糕的情况是,您可以在项目渲染器中侦听滚动和滚动。我认为这是一个bug。ListBase.mouseOverHandler现在在调度ITEM_ROLL_OVER事件时设置一个名为LastHighlightItemRenderRatines的变量,然后在ListBase.clearHighlight(由mouseOutHandler调用)中调度ITEM_ROLL_OUT事件时使用该变量(与LastHighlightItemIndex一起) 问题是,当您将鼠标从一行移到另一行时,首先调用mouseOverHandler,设置lastHightlight。。。变量,然后当随后调用mouseOutHandler时,它使用lasthlight。。。刚刚设置的值,其结果是为同一渲染器获得连续的“回滚”和“回滚”事件
坦白地说,我不知道为什么ListBase.clearHighlight在调度ITEM_ROLL_OUT事件时不使用传入的渲染器(这是它在SDK 2中的工作方式),因为这是正在“推出”的实际渲染器。也有同样的问题。super.data已被设置,该项与卷展栏和滚动事件相同。我最终选择了anirudhsasikumar的最坏情况场景,并在项目渲染器中听取了滚动和滚动。似乎工作正常。我也遇到过同样的问题。我最终对mx.controls.List类进行了子类化,并重写了clearHighlight函数。据我所知,LastHighlightItemIndexs变量仅在该函数中读取。因此,执行以下操作可以解决此问题:
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类,就可以获得预期的行为。我在FlexSDK3.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>
[其他代码…]
感谢吉诺·巴索在上面的帖子中提出的想法。希望能有所帮助。谢谢您的解决方案。这真的解决了问题!不过,修正幅度很小:
listEvent.columnIndex = item.x;
listEvent.rowIndex = item.y;
应该是
listEvent.columnIndex = pt.x;
listEvent.rowIndex = pt.y;
item.x和y以像素为单位保存渲染器的坐标。事件由同一对象触发。这些对象没有重叠,它们彼此紧挨着(中间有0个像素)。这很有趣,可以解释这种行为。有人能证实这一点吗?(不幸的是,我现在没有时间深入研究mx代码。)谢谢你的提示。我会尝试它,当我回到这个项目的问题!