Flex 4 - нужна помощь с пользовательской легендой с использованием legendItemClass - PullRequest
0 голосов
/ 03 июня 2011

Я создаю собственную легенду, используя legendItemClass, чтобы выделить каждый элемент, когда пользователь переворачивается, удалить его, когда он скатывается, и выделить его немного по-другому, когда он щелкнет. Это все работает просто отлично, но я также хочу, чтобы круговой клин взорвался, когда пользователь нажмет. У меня есть кусок кода, но он требует LegendMouseEvent. Я также думаю, что смогу переписать код, если смогу получить displayName, но я тоже потерян. Вот что у меня есть:

Легенда:

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

Explode:

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

1 Ответ

0 голосов
/ 06 июня 2011

Почему бы вам просто не создать новое LegendMouseEvent, используя приведенный ниже код new LegendMouseEvent(LegendMouseEvent.ITEM_CLICK, e, this), и передать его взорваться.Вы можете использовать типы nay из класса LegendMouseEvent , e - MouseEvent передается обработчику кликов

...