【问题标题】:How to customize highlighted data point circles in Flex charts?如何在 Flex 图表中自定义突出显示的数据点圆圈?
【发布时间】:2012-02-03 06:34:22
【问题描述】:

我需要使用 LineSeries 自定义标准 Flex LineChart 的外观。当鼠标指针悬停在数据点上时,我无法弄清楚如何更改默认绘制的圆圈。

【问题讨论】:

    标签: apache-flex charts customization


    【解决方案1】:

    如果要删除这些圈子,请将图表的属性showDataTipTargets 设置为false。如果你想自定义它们,你可以:

    1. 创建您的自定义 dataTipRenderer 并在那里执行蒙皮和绘图。
    2. 扩展您的LineChart 并覆盖positionAllDataTips 方法,该方法在ChartBase 类中定义。下面是代码,负责绘制圆圈:

    代码:

    if (showTarget) {
    
        if (len>1) {
            if (calloutStroke) {
                calloutStroke.apply(g, null, null);
                if (tipData.isRight) {
                    g.moveTo(localPts.x,
                        localPts.y+tipData.height/2);
                g.lineTo(tipData.x,
                        localPts.y+tipData.height/2);
                g.lineTo(tipData.x, tipData.y);
            }
            else {
                if (layoutDirection == LayoutDirection.RTL) {
                    g.moveTo(localPts.x-tipData.width,
                            localPts.y+tipData.height/2);
                }
                else {
                    g.moveTo(localPts.x+tipData.width,
                            localPts.y+tipData.height/2);
                }
                g.lineTo(tipData.x,
                        localPts.y+tipData.height/2);
                g.lineTo(tipData.x, tipData.y);
            }
        }
    }
    
    var tipColor:uint=tipData.hd.contextColor;
    g.lineStyle(1, tipColor, 100);
    g.moveTo(tipData.x, tipData.y);
    g.beginFill(0xFFFFFF, 1);
    g.drawCircle(tipData.x, tipData.y, TOOLTIP_TARGET_RADIUS);
    g.endFill();
    

    【讨论】:

    • 1.您写道:“将图表的属性 showDataTipTargets 设置为 false”,但这不是我需要的。 showDataTipTargets 显示数据点中的点。当您将光标移到其中一个数据点上时,我指出的点就会出现。
    • 2. “自定义 dataTipRenderer”不允许我绘制我在上图中指定的圆点。我尝试复制 CircleItemRenderer 类的功能,并完全删除了负责绘制任何元素的功能 - 当我将鼠标移到上方时,我仍然可以看到带点的圆圈。
    • 3. “扩展您的 LineChart 并覆盖在 ChartBase 类中定义的 positionAllDataTips 方法” - 只有这个可以提供帮助,但我必须弄清楚如何重写那个巨大的 positionAllDataTips 方法......
    • 我放弃了覆盖绘制不同数据点的功能。上面的代码由 Timofei 提供,在两个地方重复 (!):ChartBase.positionDataTips 和 ChartBase.positionAllDataTips 方法。每个方法大约有 350 行代码,并使用一些在控件的不同位置初始化和填充的私有变量!为了覆盖圆圈的绘制,必须从基本控件中复制大约 1000 行代码((我的结论是 ChartBase 对此类元素的自定义非常糟糕。无论如何,我感谢 Timofei 的帮助。
    • @timofei-davydik 正如 Safor 所提到的,当覆盖此方法时,这里需要复制大量代码。您是否有完整的覆盖代码可供参考?您是如何摆脱对 _allTipCache 之类的引用的?
    【解决方案2】:

    Timofei Davydik 给出了一个非常好的答案,它也帮助我处理数据提示

    但是,我在 cmets 中看到,对于如何准确地覆盖 ChartBase.positionDataTipsChartBase.positionAllDataTips 这两个大型函数存在一些困惑。

    一种方法是执行以下操作:

    1. 创建一个扩展 ChartBase 或其子级的新图表类。
    2. 将 ChartBase 样式 showDataTipTargets 设置为 false。
    3. 在您的自定义图表类上创建一个新样式showCustomDataTipTargets
    4. 覆盖positionDataTipspositionAllDatatips

    新的覆盖函数应该如下所示:

    override protected function positionDataTips():void
    {
      this.setStyle("showDataTipTargets", false);
    
      // this will do all the normal rendering of the datatips and callout
      // but it will not draw the dataTipTarget because that is dependent upon
      // the style, showDataTipTargets
      super.positionDataTips();
    
      // now here you draw your custom datatip target. 
      // Use the following code as a guide, it is
      // copied from the ChartBase.positionDataTips
      /*
      if (len > 1)
      {
        if (calloutStroke)
        {
          calloutStroke.apply(g,null,null);
    
          if (tipData.isRight)
          {                   
            g.moveTo(chartLocalPts.x,
                    chartLocalPts.y + tipData.height /  2);
            g.lineTo(tipData.x,
                    chartLocalPts.y + tipData.height / 2);
            g.lineTo(tipData.x, tipData.y);
          }
          else
          {
            if(layoutDirection == LayoutDirection.RTL)
            {
            g.moveTo(chartLocalPts.x - tipData.width,
            chartLocalPts.y + tipData.height / 2);
            }
            else
            {
            g.moveTo(chartLocalPts.x + tipData.width,
            chartLocalPts.y + tipData.height / 2);
            }
              g.lineTo(tipData.x,
                      chartLocalPts.y + tipData.height / 2);
              g.lineTo(tipData.x, tipData.y);
            }
        }
      }
    
      var tipColor:uint = tipData.hd.contextColor;
      g.lineStyle(1, tipColor, 100);
      g.moveTo(tipData.x, tipData.y);
      g.beginFill(0xFFFFFF, 1);
      g.drawCircle(tipData.x, tipData.y, TOOLTIP_TARGET_RADIUS);
      g.endFill();
    
      g.beginFill(tipColor, 1);
      g.drawCircle(tipData.x, tipData.y,
                TOOLTIP_TARGET_INNER_RADIUS);
      g.endFill();
      */
    
    }
    

    【讨论】:

      【解决方案3】:

      解决方案

      有必要创建一个自定义itemRenderer 并在MOUSE_OVER 事件处理程序中绘制您想要的任何内容。图表的showDataTipTargets 属性必须设置为false

      在寻找解决方案时,我忘记了itemRenderer 是 Fl​​ex 组件并且可以处理鼠标事件。我的同事指出了它并帮助解决了这个问题。

      代码

      CustomDataTipTargetRenderer.mxml

      <?xml version="1.0" encoding="utf-8"?>
      <s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                      xmlns:s="library://ns.adobe.com/flex/spark" 
                      creationComplete="init()"
                      ...>
          <fx:Script>
              <![CDATA[
                  private function init():void
                  {
                      addEventListener(MouseEvent.MOUSE_OVER, onMouseOver); 
                      addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
                  }
      
                  private function onMouseOver(event:MouseEvent):void
                  { 
                      // Show custom data tip target point. 
                  } 
      
                  private function onMouseOut(event:MouseEvent):void
                  { 
                      // Hide custom data tip target point.
                  }
              ]]>
          </fx:Script>
      </s:ItemRenderer>
      

      YourView.mxml

      <mx:LineChart ...
                    showDataTips="true"
                    showDataTipTargets="false">
          ...
          <mx:series>
              <mx:LineSeries ... itemRenderer="yournamespace.CustomDataTipTargetRenderer">
                  ...
              </mx:LineSeries>
          </mx:series>
      </mx:LineChart>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-06
        • 2011-03-18
        • 1970-01-01
        • 2013-11-15
        • 1970-01-01
        相关资源
        最近更新 更多