在Flex条形图中显示除y轴之外的图像/图标

时间:2011-07-28 06:43:59

标签: flex charts categories customization

我试图在y轴上放置标签以外的图像。所以我创建了一个自定义标签渲染器(包含和的HBox)。必须基于数据提供者中存在的属性来设置图像的来源。问题是,我无法访问fnSetSource()方法中的BarSeriesItem。非常感谢任何帮助或指示。 这是整个代码。

 <mx:Application  xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical"
        width="1280" height="750">  
  <mx:Script><![CDATA[
    import mx.collections.ArrayCollection;
    import mx.charts.series.items.PlotSeriesItem;
    import mx.controls.Label;
    import mx.controls.Image;
    import mx.containers.HBox;
    import mx.charts.series.items.BarSeriesItem;
    import mx.charts.series.ColumnSeries;
    import mx.charts.series.items.ColumnSeriesItem;
    import mx.charts.chartClasses.Series;
    import mx.charts.ChartItem;
    [Bindable]
public var employeedetails:ArrayCollection = new ArrayCollection([              
{rank:"10",emplName:"Peter",prevRank:"7",imgSource:"images/increase.png"},
{rank:"9",emplName:"Mark",prevRank:"3",imgSource:"images/decrease.png"},
{rank:"8",emplName:"Eric",prevRank:"8",imgSource:"images/decrease.png"}


]);
    ]]>
    </mx:Script>    


    <mx:BarChart id="bar" height="100%"  
            paddingLeft="15" paddingRight="5" 
            showDataTips="true"  width="847" 
            dataTipMode="multiple" >
            <mx:verticalAxis>
                <mx:CategoryAxis id="v1" categoryField="emplName" dataProvider="{employeedetails}"/>
            </mx:verticalAxis>

            <mx:verticalAxisRenderers>
                <mx:AxisRenderer placement="left" axis="{v1}">
                    <mx:labelRenderer>
                        <mx:Component>
                            <mx:HBox width="100%" height="100%" minWidth="120" minHeight="20">
                                <mx:Image id="axisImage" height="16" width="16" source="fnSetSource()">
                                    <mx:Script><![CDATA[
                                        import mx.charts.chartClasses.Series;
                                        import mx.charts.ChartItem;
                                        import mx.charts.series.items.BarSeriesItem;                                        
                                        [Bindable]
                                        public function fnSetSource(element : ChartItem, series : Series) : String
                                        {
                                        var data : BarSeriesItem = BarSeriesItem(element);
                                        var imgSrc : String = "";
                                        if (data.item.isIncrease)
                                        {
                                        imgSrc = "images/increase.png";
                                        } else if (data.item.isDecrease)
                                        {
                                        imgSrc = "images/decrease.png";
                                        }
                                        else
                                        {
                                        imgSrc = "";
                                        }
                                        return imgSrc;
                                        }
                                    ]]></mx:Script>
                                </mx:Image>
                                <mx:Label id="axisLabel" fontSize="12" width="100%" height="100%">
                                    <mx:Script><![CDATA[
                                        [Bindable]
                                        override public function set data(value : Object) : void
                                            {
                                            if (value == null)
                                            {
                                                return;
                                            }
                                            var length : int = value.text.toString().length;
                                            if (length > 15)
                                            {
                                                axisLabel.text = value.text.toString().substr(0, 15) + "...";
                                                axisLabel.toolTip = value.text;
                                            }
                                            else
                                            {
                                                axisLabel.text = value.text;
                                            }
                                        }
                                    ]]>
                                    </mx:Script>
                                </mx:Label>
                            </mx:HBox>
                        </mx:Component>
                    </mx:labelRenderer>
                </mx:AxisRenderer>
            </mx:verticalAxisRenderers>
            <mx:series>
                <mx:BarSeries id="bs2"
                yField="emplName" 
                xField="rank" 
                displayName="Rank"    
                dataProvider="{employeedetails}"                                 
                />          
        </mx:series>
    </mx:BarChart>
</mx:Application>

2 个答案:

答案 0 :(得分:0)

我快速查看了代码。在将fnSetSource()函数放在大括号内之前,不会调用它:source =“{fnSetSource()}”

这将获得要调用的函数,但是您将得到错误,因为fnSetSource()调用没有fnSetSource函数所需的2个参数。做我提到的第一个改变,你也许可以从那里弄明白。

你能不能制作一个单独的mxml组件的项目渲染器?

答案 1 :(得分:0)

看起来你没有传递fnSetSource()需要的任何参数,所以它不会工作,直到你传递这两个参数.. 以这种方式使用你的功能 fnSetSource(值:对象,PREVIOUSVALUE:对象,轴:IAxis不):字符串