0

我正在使用 legendItemClass 创建一个自定义图例,以在用户滚动时突出显示每个项目,在他们滚动时将其删除,并在单击时以不同的方式突出显示它。这一切都很好,但我也希望当用户点击时饼楔会爆炸。我有这段代码,但它需要 LegendMouseEvent。我也在想,如果我能得到 displayName,我也许可以重新编写代码,但我也很茫然。这是我所拥有的:

传奇:

<mx:Legend id="legend" width="100%" direction="vertical"
  labelPlacement="right" markerHeight="10" markerWidth="10"
  legendItemClass="CustomPieLegendItem"
  itemClick="explode(event)"
  color="{_color}" />

爆炸:

public function explode(event:LegendMouseEvent) : void {
    var len : Number = PieSeries(event.item.source).legendData.length;
    var index : Number = 0;
    var arr:Array = new Array(len);
    if(over){
        event.item.alpha = 0.70;
    } else {
        event.item.alpha = 0.70;
        for(var i : Number = 0; i < len ; i++){
            if(event.item.label == event.item.source.legendData[i].label){
                index = i;
                arr[i] = 0.1;
            }else {
                arr[i] = 0;
            }
        }
        PieSeries(event.item.element).perWedgeExplodeRadius = arr;
    }
}

班级:

package
{
  import custom.charts;

  import flash.display.Sprite;
  import flash.events.MouseEvent;

  import ilog.core.ilog_internal;

  import mx.charts.LegendItem;
  import mx.charts.events.LegendMouseEvent;
  import mx.charts.series.PieSeries;
  import mx.charts.series.items.PieSeriesItem;

  public class CustomPieLegendItem extends LegendItem {
    public function CustomPieLegendItem(){
      super();
    }

    private var mouseSprite:Sprite;

    private var state:int=0;
    private static var IDLE_STATE:int=0;
    private static var OVER_STATE:int=1;
    private static var SELECTED_STATE:int=2;


    public function get selected():Boolean{
      return (state == OVER_STATE || state == SELECTED_STATE);
    }

    public function set selected(value:Boolean):void {
      if (value)
        state=SELECTED_STATE;
      else
        state=IDLE_STATE;
        invalidateDisplayList();
    }

    private function clickHandler(e:MouseEvent):void {
        charts(document).resetSeries();
        state=SELECTED_STATE;
        // returns the item USED for the displayName, not the actual name
        trace((element as PieSeries).displayName);
        // does not work because I need to pass a LegendMouseEvent
        charts(document).explode("NEEDS LegendMouseEvent HERE");
        invalidateDisplayList();
    }

    private function overHandler(e:MouseEvent):void {
      if (state != SELECTED_STATE){
        state=OVER_STATE;
        invalidateDisplayList();
      }
    }

    private function outHandler(e:MouseEvent):void {
      if (state != SELECTED_STATE){
        state=IDLE_STATE;
        invalidateDisplayList();
      }
    }

    override protected function createChildren():void {
        super.createChildren();
        mouseSprite=new Sprite();

        addChild(mouseSprite);
        mouseSprite.addEventListener(MouseEvent.MOUSE_OVER, overHandler);
        mouseSprite.addEventListener(MouseEvent.MOUSE_OUT, outHandler);
        mouseSprite.addEventListener(MouseEvent.MOUSE_DOWN, clickHandler);
    }

    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
      super.updateDisplayList(unscaledWidth, unscaledHeight);
      mouseSprite.graphics.clear();
      mouseSprite.graphics.beginFill(0, 0);
      mouseSprite.graphics.drawRect(0, 0, unscaledWidth, unscaledHeight);
      graphics.clear();
      if (state == OVER_STATE || state == SELECTED_STATE)
      {
        graphics.beginFill(0xCCCCCC, 0.2);
        if (state == SELECTED_STATE)
          graphics.lineStyle(1, 0xCCCCCC);
          graphics.drawRect(-2, 0, width+2, height);
      }
    }
  }
}
4

1 回答 1

0

为什么不使用下面的代码创建一个新的 LegendMouseEventnew LegendMouseEvent(LegendMouseEvent.ITEM_CLICK, e, this) 并将其传递给爆炸。您可以使用LegendMouseEvent类中的任何类型,e - MouseEvent 传递给 clickhandler

于 2011-06-06T04:05:39.073 回答