Использование AS3 для применения цвета к динамически создаваемым искровым прямоугольникам

в FlashBuilder я хочу динамически генерировать примерно 1200 прямоугольников из файла CSV (все они разных цветов), которые будут выполнять действие при нажатии.

Каков наилучший способ сделать это? Я читал, что API для рисования на Air и Android — не очень хорошая идея, и я думаю об использовании класса Spark Rectangle, но я не могу понять, как применить к нему цвет, если я их генерирую. динамически используя AS?


person Andrew Dover    schedule 16.12.2010    source источник
comment
Вы должны указать, в каком формате ваши данные (в csv у вас есть точки или размеры формы). Кроме того, покажите код. Мне кажется, что класс Rectangle, который вы используете, представляет собой структуру данных, а не класс, связанный с формой/графикой. Посмотрите на графическое свойство Sprite.   -  person goliatone    schedule 16.12.2010


Ответы (2)


После прочтения CSV-файла прокрутите элементы и вызовите функцию примерно так:

        private function addRect(color:uint, xPos:Number, yPos:Number, width:Number, height:Number):void {
            var rect:Rect = new Rect();
            rect.x = xPos;
            rect.y = yPos;
            rect.width = width;
            rect.height = height;
            var fillColor:SolidColor = new SolidColor(color);
            rect.fill = fillColor;
            var obj:Group = new Group();
            obj.addElement(rect);
            obj.addEventListener(MouseEvent.CLICK, this.onClick);
            this.addElement(obj);
        }

        private function onClick(e:Event):void {
            trace("clicked");
        }

Надеюсь, это поможет.

person Wade Mueller    schedule 16.12.2010
comment
Этот ответ ближе всего к тому, что я ищу, однако, как бы вы тогда получили доступ к дочернему элементу, под которым был нажат контейнер? Как теперь у меня есть список прямоугольников, каждый из которых должен возвращать отдельные данные? Я попытался переместить прослушиватель событий в отдельные прямоугольники, но не получил никакой радости! - person Andrew Dover; 20.12.2010

Вы можете сделать весь пользовательский интерфейс декларативно. Разберите CSV на структуры данных и поместите его в файл ArrayCollection. В этом примере я просто собрал три образца.

Затем создайте DataGroup и установите dataProvider="rectangles", а затем создайте itemRenderer.

Этот пример работает хорошо, ИМО:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               minWidth="955" minHeight="600">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            var rectangles:ArrayCollection = new ArrayCollection([
                {color: 0x00FF00, x: 5, y: 10, width: 30, height: 40},
                {color: 0xFF0000, x: 50, y: 100, width: 300, height: 400},
                {color: 0x0000FF, x: 55, y: 10, width: 30, height: 40},
                ]);

        ]]>
    </fx:Script>

    <s:DataGroup dataProvider="{rectangles}" itemRenderer="RectangleRenderer" />
</s:Application>

Тогда itemRenderer выглядит так:

<?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" 
                xmlns:mx="library://ns.adobe.com/flex/mx" 
                autoDrawBackground="true" 
                click="whenClicked()" 
                x="{data.x}" y="{data.y}" 
                width="{data.width}" height="{data.height}">
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            private function whenClicked():void {
                Alert.show("clicked");
            }
        ]]>
    </fx:Script>

    <s:Rect width="100%" height="100%">
        <s:fill>
            <s:SolidColor color="{data.color}" />
        </s:fill>
    </s:Rect>
</s:ItemRenderer>
person Brian Genisio    schedule 16.12.2010