Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   UI/ Контейнеры (http://www.flasher.ru/forum/showthread.php?t=201642)

Unkeep 19.06.2013 14:01

UI/ Контейнеры
 
Какие контейнеры лучше использовать в приложении с простым GUI? Хочу на их базе сверстать Header, Content, Footer. Что бы можно было менять их свойства типа BackgroudColor, BorderColor и чтобы контролы внутри них имели относительные контейнера размеры. Например, изменил размер хедера -> изменилось расположение кнопки.
начал писать свой класс, но может есть что-то готовое уже? да и не уверен я за свой контейнер..
Код AS3:

public class Container extends Sprite
        {
                public function Container(w:Number=0,h:Number=0) {
                        _width = w;
                        _height = h;
                }
 
                protected:
                        var _background:Sprite = new Sprite();;
                        var _border:Sprite = new Sprite();
 
                        var _height:Number = 0;
                        var _width:Number = 0;
 
                        var _borderThickness:Number = 1;
                        var _borderColor:uint = 0x000000;
 
                        var _backgroundColor:uint = 0xFFFFFF;       
 
 
                public function set Height(height:Number) {
                        _height = height;
                        Init();
                }
                public function set Width(width:Number) {
                        _width = width;
                        Init();
                }       
                public function get Height():Number {
                        return _height;
                }
                public function get Width():Number {
                        return _width;
                }
 
                public function set BorderThickness(thickness:Number) {
                        _borderThickness = thickness;
                        Init();
                }
 
                public function set BorderColor(color:uint) {
                        _borderColor = color;
                        Init();
                }
                public function set BackgroundColor(color:uint) {
                        _backgroundColor = color;
                        Init();
                }
 
                public function  Init()
                {
                        _background.graphics.clear();
                        _background.graphics.beginFill(_backgroundColor);
                        _background.graphics.drawRect(0, 0, _width, _height);
                        addChild(_background);
 
                        _border.graphics.clear();
                        _border.graphics.lineStyle(_borderThickness, _borderColor);
                        _border.graphics.drawRect(0, 0, _width, _height);
                        addChild(_border);
                }

хедер

Код AS1/AS2:

public class HeaderMenu extends Container 
        {
                var  btnLoad:Button = new Button();
 
                public function HeaderMenu(w:Number, h:Number) {
                        super(w,h);
                        _backgroundColor = 0xE13737;
                        btnLoad.label = 'Загрузить SWF';
                        Init();
 
 
                }
 
                public override function Init()
                {
                        super.Init();
                        btnLoad.x = 10;
                        btnLoad.y = Height / 2 - btnLoad.height / 2;
                        addChild(btnLoad);
                }
 
        }

Добавлено через 11 минут
Да и в таком случае, если я меняю цвет фона контейнера (через свойство базового класса), помимо перерисовки фона и рамки ещё заново перерасчитаются координаты кнопки. а это уже лишнее. Контролы должны перестраиваться только при изменении размера контейнера.

Добавлено через 1 час 1 минуту
можно разбить Init() на две функции. одна будет перерисовывать фон и рамку и вызываться при изменение любого свойства , а вторая виртуальная будет перестраивать контролы и вызываться только при изменении Height, Width. Работать будет, но может плюнуть и воспользоваться каким-нибудь готовым решением?

strangedk 19.06.2013 18:11

Нужно реализовать что-то типа commitProperties и invalidate, как во Flex

Т.е. обновлять только те свойства, которые менялись. Это разумеется добавляет больше кода, но стоит того, если ради оптимизации.

Котяра 19.06.2013 18:59

посмотри на
http://sibirjak.com/osflash/projects...ns-ui/layouts/
http://www.as3commons.org/as3-commons-ui/index.html

expl 20.06.2013 17:29

Цитата:

Т.е. обновлять только те свойства, которые менялись. Это разумеется добавляет больше кода, но стоит того, если ради оптимизации.
Это если Вы приложение делаете и у вас нет дизайнера.
А если это игра - то забудьте про валидацию, не создавайте себе проблем, лучше вручную вызовите свойство UpdateSize() после добавления детей или если какой-то компонент должен занять больше/меньше пространства. Тупо меньше багов будет и времени меньше убъёте. Валидация будет мешеать воплощать то, что нарисовал диз.

И с первого раза без опыта систему валидации нормальную не сделать.
Самая нормальная валидация реализована во Flex, но и там оно бажит и требует очень хорошо себя знать при написании компонентов.
А то что сделано в AsWing - это вообще тихий ужас - оно никогда нормально не обновляло размеры. Так что либо Flex - либо ручками.

djyamato 20.06.2013 19:58

flex, там уже все написано


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

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