Apache flex 项目渲染器更改背景颜色

Apache flex 项目渲染器更改背景颜色,apache-flex,flex4,flex4.5,background-color,itemrenderer,Apache Flex,Flex4,Flex4.5,Background Color,Itemrenderer,我有一个要更改默认颜色的项目渲染器: <s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" initialize="init(event)"

我有一个要更改默认颜色的项目渲染器:

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:s="library://ns.adobe.com/flex/spark"
                xmlns:mx="library://ns.adobe.com/flex/mx"
                initialize="init(event)"
                creationComplete="created(event)"
                dataChange="created(event)"
                width="100%"
                maxWidth="{FlexGlobals.topLevelApplication.width}"
                contentBackgroundColor.hovered="0xff0018"
                focusColor="0xff00ff"
                contentBackgroundAlpha="0.8">

        <s:states>
            <s:State name="normal"/>
            <s:State name="hovered"/>
            <s:State name="selected"/>
        </s:states>
如何更改项目渲染器的背景色


我知道我可以给它剥皮,但如果换一个简单的颜色,那就太过分了。我肯定几年前我就让它不用剥皮就可以正常工作了。

一开始这总是有点让人困惑。在我看来,样式名称选择不当。血淋淋的细节都在
itemrender
类的
trackground()
方法中

contentBackgroundColor
样式是可以在
列表
组件本身上设置的,它对渲染器没有影响。它将填充列表的背景色,但通常渲染器会占据该区域的所有区域,因此您永远看不到它。例如,如果列表很高,但其中只有1或2个项目(因此底部的空间未被渲染器覆盖),则该列表将可见

设置渲染器的背景色:

不要使用
contentBackgroundColor
,而是使用
alernatingItemColors
样式。此样式需要一个值数组。如果只需要一种颜色,只需在数组中放置一个元素:

alternatingItemColors="[#c0c0c0]"
通过查看
trackground()
中的代码,如果要在背景颜色上设置alpha,则必须自己绘制背景(见下文)

您可能希望设置的其他与背景相关的样式:

  • downColor
  • selectionColor
  • rollOverColor
要绘制自己的背景色:

autodrackground
属性设置为false。这意味着您现在必须为所有不同的渲染器状态(“正常”、“选定”、“悬停”等)绘制自己的颜色。幸运的是,您可以在渲染器中执行此操作,使用与上面在您选择的背景对象(Rect等)上使用的相同的状态语法



再次感谢,效果非常好。我可能会在将来重新考虑,您是否认为放弃列表/项目渲染器而只使用基于组的自定义组件并手动添加/删除它是个坏主意?列表/渲染器解决了许多常见问题(鼠标/键盘交互、选择等)。如果你不需要它们,你可以用一个定制的组件做一些更轻量级的东西,但这可能需要更多的工作。此外,考虑使用DATGRAUP而不是组,列表扩展了具有很多有用功能的DATAGUUP,但对于10个项目来说,这可能太多了。列表/数据组最大的优点是它提供给您的对象池(当屏幕上的项目太多时)。我禁用了virtualLaybout(它在滚动时不断更新错误的图像),所以对象池不是一个优点:)谢谢。@DominicM这是一个w/项目渲染器循环,但解决方案非常简单。如果列表中有很多元素,对象池将非常有利。
alternatingItemColors="[#c0c0c0]"
<s:ItemRenderer autodrawBackground="false">
    <s:states>
        <s:State name="normal"/>
        <s:State name="hovered"/>
        <s:State name="selected"/>
    </s:states>
    <s:Rect id="theBackgroundObject" top="0" bottom="0" left="0" right="0">
        <s:fill>
            <s:SolidColor color="#FF0000" color.hovered="#00FF00"
                alpha="1" alpha.hovered=".5" />
        </s:fill>
    </s:Rect>
</s:ItemRenderer>