Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Как растянуть графику в s:Group ? (http://www.flasher.ru/forum/showthread.php?t=193121)

AlexLucas 23.01.2013 18:39

Как растянуть графику в s:Group ?
 
Доброго времени суток.
Рисую круг на s:Group
Код AS3:

var grp:Group = new Group();
 
addElement(grp);
grp.graphics.beginFill(0xFF0000);
grp.graphics.drawCircle(100, 100, 100);
grp.width = 500;

Когда задаю ширину, нужно чтобы и нарисованный круг также растягивался вместе с компонентом (как Sprite), но этого не происходит.
Подскажите пожалуйста как заставить эту графику растгягиваться именно в группе, чтобы не приходилось добавлять UIComponent, в него добавлять Sprite и в нём рисовать этот круг, потом при растягивании все эти элементы обновлять?

Astraport 23.01.2013 19:12

Либо вешаете ресайз ивент и перерисовываете круг по его срабатыванию, либо задавайте лейаут группы через top, left и т. д.

alatar 24.01.2013 03:50

spark.primitives.Ellipse

AlexLucas 24.01.2013 22:37

alatar, Astraport спасибо.
Дело в том, что у меня не только круг, но и полигоны с n сторонами надо растягивать, которых в этих примитивах нет. Я так понимаю, если я их нарисую с помощью этих классов, а потом буду растягивать. они также будут себя вести как и graphics - при растягивании толщина линии увеличивается / уменьшается. То же самое будет с бордером всех элементов.
Т.е. получается единственный выход, в этом случае, перерисовывать при ресайзе.

alatar 24.01.2013 23:46

1. Написание своего примитива ничуть не труднее использования Graphics.
2. Нет. При изменении размеров котейнера примитивы перерисовываются для новых размеров.

AlexLucas 31.01.2013 15:14

Цитата:

Написание своего примитива ничуть не труднее использования Graphics.
Не могли бы вы скинуть ссылку на то как это сделать ?
Наследуюсь от FilledElement, и в draw() рисую сам полигон через обычные функции Graphics, но, во-первых - полигон не заливается, хотя fill я задаю (правда два края полигона немного не замыкаются), во-вторых - при ресайзе самой группы в которой всё это рисуется, не изменяются размеры полигона, мне надо вручную прописать изменения ?
Единственное что нашёл - это вот эту тему. Но там вся тема не раскрыта.

alatar 31.01.2013 16:17

https://github.com/alatarus/gauges/b.../DonutSlice.as

AlexLucas 31.01.2013 20:03

Спасибо, понял ошибку с растягиванием.
Но всё ещё не получается задать заливку. Как я сказал, полигон немного не замыкается полностью, есть какие-нибудь опции заливки, что-то вроде Close Small Gaps во флэш IDE? Или нужно чтобы обязательно была замкнутый сегмент ?
Задаю заливку через тэг fill, когда считываю значение color заливки, возвращает правильный цвет, но заливка не применяется к фигуре.

Добавлено через 4 минуты
Дописал алгоритм чтобы нормально всё замыкалось, всё равно не заливается.
Graphics сам должен знать что заливать. раз не надо использовать beginFill и endFill ?

alatar 31.01.2013 20:45

Код покажите.

AlexLucas 31.01.2013 20:57

Группа в которой находится примитива
Код AS3:

<s:Group .... >
<root:PolygonHelper id="poly">
                <root:fill>
                        <s:SolidColor id="fill" color="0xFF00FF" alpha="1" />
                </root:fill>
                <root:stroke>
                        <s:SolidColorStroke id="border" color="0xFF0000" weight="2" alpha="1" />
                </root:stroke>                       
 
        </root:PolygonHelper>
//......
</s:Group

Рисую примитиву так
Код AS3:

override protected function draw(g:Graphics):void {
 
                        sid = 0;
 
                        points=new Array();
                        ratio=360/_segments;
                        sideTop = _centerY - _radiusY;
 
                        for(var i:int=_rotating;i<=360+_rotating;i+=ratio)
                        {
                                var xx:Number=_centerX+Math.sin(radians(i))*_radiusX;
                                var yy:Number=sideTop+(_radiusY-Math.cos(radians(i))*_radiusY);
                                points[sid]=new Array(xx,yy);
                                if(sid>=1)
                                {
 
                                        g.moveTo(points[sid-1][0], points[sid-1][1]);
                                        g.lineTo(points[sid][0], points[sid][1]);
                                }
                                sid++;
                        }
 
                        sid = 0;               
                }
 
//обновляю размеры при растягивании
public function update():void {                                               
 
                        _radiusX = _centerX =  this.width / 2;
                        _radiusY = _centerY = this.height / 2;
 
                        //invalidateSize();
                        invalidateDisplayList();                         
                        //invalidateParentSizeAndDisplayList();    эти перепробовал, не помогло
                }

Рисует всё правильно , но не заливает.

Добавлено через 10 минут
всё из-за того что использую после отрисовки каждой прямой moveTo, а надо использовать всего один раз. Чего не знал того не знал.
Работает, alatar спасибо за участие, и за ваши примеры :)


Часовой пояс GMT +4, время: 02:28.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.