Flex:有没有办法让TileList突出显示“over”itemRenderer?

时间:2009-05-13 14:11:32

标签: flex itemrenderer

我的项目渲染器是一个图像,所选项目的突出显示位于图像下方,因此您无法看到突出显示,是否有办法使图像突出显示“?”

感谢。

3 个答案:

答案 0 :(得分:3)

这正是我意识到Flex中某些看似简单的东西真的很复杂的地方。 :)

根据您所处的效果,有多种方法可以处理类似这样的问题,但我总是这样做的方法首先是覆盖TileList的某些功能,然后使用自定义itemRenderers。 (我从来没有弄清楚如何在渲染内容的顶部上绘制List的绘图图形对象,但是其他人可能会对此有所了解。)< / p>

例如,我通常会创建一个扩展TileList的新类,然后覆盖负责绘制突出显示和选择指示器的方法,以便更好地控制这些函数绘制指标的方式(或者有时我会只是完全注释掉他们的内容,这样就不会画出任何东西了):

public class MyCustomTileList extends TileList
{
    public function MyCustomTileList()
    {
        super();
    }

    override protected function drawHighlightIndicator(indicator:Sprite, x:Number, y:Number, width:Number, height:Number, color:uint, itemRenderer:IListItemRenderer):void
    {           
        var g:Graphics = Sprite(indicator).graphics;
            g.clear();
            g.beginFill(getStyle("myRolloverColor"), getStyle("myRolloverAlpha"));
            g.drawRect(1, 1, width - 1, height - 1);
            g.endFill();

            indicator.x = x;
            indicator.y = y;
    }

    override protected function drawSelectionIndicator(indicator:Sprite, x:Number, y:Number, width:Number, height:Number, color:uint, itemRenderer:IListItemRenderer):void
    {
        //
    }
}

但正如你所说,由于图形对象似乎总是在后面列出项目的内容,我通常会选择使用项目渲染器绘制一些东西(例如,半透明的盒子) )在与我的数据项相关联的图像之上:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">

    <mx:Script>
        <![CDATA[

            private function img_rollOver():void
            {
                highlight.visible = true;
            }

            private function img_rollOut():void
            {
                highlight.visible = false;
            }

        ]]>
    </mx:Script>

    <mx:Image id="img" source="{something}" horizontalCenter="0" verticalCenter="0" buttonMode="true" useHandCursor="true" mouseChildren="true" rollOver="img_rollOver()" rollOut="img_rollOut()" />
    <mx:Box id="highlight" alpha="0.1" color="#FFFFFF" horizontalCenter="0" verticalCenter="0" width="{img.width}" height="{img.height}" buttonMode="true" useHandCursor="true" mouseChildren="true" rollOver="img_rollOver()" rollOut="img_rollOut()" visible="false" />

</mx:Canvas>

我确信还有其他方法,但这个方法对我来说效果很好,而且我通常也会找到继承Flex库存控件的其他好处。

希望它有所帮助!

答案 1 :(得分:1)

使用边框的想法,通过2px填充图像? 想到的另一种选择是绝对定位......

答案 2 :(得分:0)

我认为关闭选择和突出显示效果更容易,然后在渲染器中创建您期望的内容。渲染器的数据需要在其中包含某种.selected属性。然后,渲染器可以绑定或响应对其data.selected(或类似的东西)的更改,并根据需要更新它的外观。

当我别无选择时,我只使用列表中的默认视觉效果。我永远不想尝试将List扩展到它(尽管,好的代码Christian)。