【问题标题】:Custom AxisRenderer自定义轴渲染器
【发布时间】:2012-05-29 19:25:27
【问题描述】:

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

我尝试创建一个自定义类 extends Groupimplements IDataRenderer。但是,在IDataRenderer 中定义的public function set data(value:Object) 似乎总是以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");
    }
}

【问题讨论】:

    标签: apache-flex flex4 flex-spark flex-charting flex-charts


    【解决方案1】:

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

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

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

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

    • 只在构造函数中设置宽度
    • 不要在子标签上设置宽度(您可能想玩这个)
    • 制作标签对象成员变量,并且在create children中只创建一次(数据的setter可能会被频繁调用)

    代码:

    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));
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 2017-11-24
      • 2013-09-25
      • 2011-07-14
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 2020-10-28
      • 2016-11-08
      相关资源
      最近更新 更多