0

我正在使用LineChartaCategoryAxis作为水平轴,我需要每个类别都有一个非常自定义的格式显示。UsingCategoryAxis.LabelFunction对于我的目的来说还不够强大,因为它只允许对 Label 对象的文本字段进行自定义格式设置。特别是对于这个项目,我需要每个类别都是两个不同多行标签的网格或 HGroup。左标签需要左对齐,右标签需要右对齐。

我尝试创建一个自定义类,extends Group并且implements IDataRenderer. 但是,在public function set data(value:Object)中定义的IDataRenderer,似乎总是以值作为AxisLabel对象调用,它不会在其中传递对象,只是一个字符串 ( AxisLabel.text)


作为 hack-ey 的替代方案,我尝试使用 LabelFunction 来传递编码字符串,但即使这样也会导致问题。不知何故,这段代码不会在 CategoryAxis 上显示任何内容:

public class HeatmapAxisLabelRenderer 
extends HGroup
implements IDataRenderer
{
public function HeatmapAxisLabelRenderer()
{
    super();

    this.includeInLayout = true;
    this.visible = true;

    this.width = 100;
    this.height = 40;
//      this.percentWidth = 100;
//      this.percentHeight = 100;
}


// Internal variable for the property value.
private var _data:Object;

// Make the data property bindable.
[Bindable("dataChange")]

// Define the getter method.
public function get data():Object {
    return _data;
}

// Define the setter method, and dispatch an event when the property
// changes to support data binding.
public function set data(value:Object):void {
    _data = value;

    if (value is AxisLabel && AxisLabel(value).text!=null) {
        var parts:Array = AxisLabel(value).text.split("|~|");
        if (parts.length != 2) return;

        var name:Label = new Label();
        name.text = parts[0];
        name.setStyle("textAlign","left");
        name.width = 100;

        var limit:Label = new Label();
        limit.text = parts[1];
        limit.setStyle("textAlign","right");
        limit.width = 100;

        this.addElement(name);
        this.addElement(limit);

        dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
    } else {
        trace("renderer bad value");
    }
}
4

1 回答 1

1

问题似乎是Groupand之间的奇怪交互AxisRenderer,以及您的渲染器 (an HGroup) 具有显式宽度/高度值(在其构造函数中设置)的事实:

在您的自定义渲染器上设置后data,AxisRenderer` 告诉自定义渲染器使其大小无效。

这样做时,Group正确的决定不做任何事情,因为它具有明确的宽度/高度。

我进行了一些更改以使其正常工作:

  • 只在构造函数中设置宽度
  • 不要在子标签上设置宽度(你可能想玩这个)
  • 使标签对象成为成员变量,并在创建子项中仅创建一次(数据的设置器可能会被频繁调用)

代码:

package
{
    import mx.charts.AxisLabel;
    import mx.core.IDataRenderer;
    import mx.events.FlexEvent;

    import spark.components.HGroup;
    import spark.components.Label;

    public class HeatmapAxisLabelRenderer extends HGroup implements IDataRenderer
    {
        public function HeatmapAxisLabelRenderer()
        {
            super();
            this.width=100;
        }

        private var _data:Object;

        [Bindable("dataChange")]
        public function get data():Object {
                return _data;
        }

        private var nameLabel:Label;
        private var limit:Label;

        override protected function createChildren():void
        {
            super.createChildren();
            if (!nameLabel)
            {
                nameLabel=new Label();
                nameLabel.setStyle("textAlign","left");
                limit = new Label();
                limit.setStyle("textAlign", "right");
                addElement(nameLabel);
                addElement(limit);
            }
        }

        public function set data(value:Object):void
        {
            if (_data === value)
                return;

            _data = value;
            if (value is AxisLabel && AxisLabel(value).text!=null)
            {
                var parts:Array = AxisLabel(value).text.split("|~|");
                if (parts.length == 2)
                {
                    nameLabel.text = parts[0];
                    limit.text = parts[1];
                }
            }
            else
            {
                trace("renderer bad value");
            }
            dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
        }
    }
}
于 2012-05-30T00:41:33.347 回答