Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Контроль превышения child размеров parent (http://www.flasher.ru/forum/showthread.php?t=145005)

aintghost 27.09.2010 16:48

Контроль превышения child размеров parent
 
Доброго времени суток,

В приложении реализован следующий алгоритм:
1. Создается sprite1 фиксированного размера.
2. sprite1 помещается на box (из библиотеки визуальных компонентов ВК, но это к делу не относится, принимаем его за sprite0).
3. На sprite1 создается фиксированного размера sprite2.
4. На sprite2 в зависимости от кол-ва данных создаются textfield.

По окончанию п.4 высота sprite2 становится больше высоты sprite1, поэтому высота sprite1 увеличивается.

Box (sprite0) при привышении допустимых размеров данных добавляет scroll.

Проблема заключается в том, что я использую sprite2.scrollRect, чтобы делать прокрутку непосредственно спрайта с данными, а родительские элементы реагируют на превышение высоты, что в итоге приводит к появлению лишнего scroll.


Каким образом мне следует организовать прокрутку sprite2 так, чтобы родительские элементы не реагировали на превышение высоты?

КорДум 27.09.2010 16:57

Эм, а вычитать из скролла лишние размеры? Если размеры изначально фиксированные, то не будет проблем найти разность между новым размером и старым.

aintghost 27.09.2010 17:30

КорДум,

Скролл реагирует на изменение высоты sprite1, который в свою очередь реагирует на изменение высоты sprite2..n. Так как на для остальных спрайтов (3..n) необходимо, чтобы скролл работал корректно, то требуется, чтобы sprite1 игнорировал именно высоту sprite2.

Поэтому, к сожалению, вариант отключения скролла или корректировки его работы будет неуместным.

derhab 27.09.2010 17:37

то есть sprite1 должен иметь фиксированную высоту?
подпишите sprite1 на событие изменения высоты sprite2 и каждый раз в таком случае устанавливайте sprite1 фиксированную высоту

aintghost 27.09.2010 18:57

derhab,

Насколько я понимаю, в таком случае уменьшатся и размеры sprite2, а значит изменится значение масштаба и данные на sprite2 будут неправильно отображены, я прав?

Да, моя задача состоит в том, чтобы sprite1 не реагировал на превышение высоты sprite2, но реагировал на превышение высоты других child.

derhab 27.09.2010 19:26

напишите свой класс для sprite1, расширяющий Sprite и переопределите свойство height, задайте нужное вам поведение..

aintghost 27.09.2010 23:16

derhab,

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

dimarik 27.09.2010 23:22

Изучите правила реализованные в других GUI-фреймворках, например, во Flex.

aintghost 28.09.2010 13:14

Написал класс, который при запросе размеров спрайта будет выдавать фиксированные значения. Присвоил данный класс объекту sprite2, тем не менее, sprite1 по какой-то причине изменяет свою высоту до реальной высоты sprite2.

Код AS3:

package
{
        import flash.display.Sprite;
 
        public class UnresizableSprite extends Sprite
        {               
                private var _width: Number;
                private var _height: Number;
 
                public function UnresizableSprite(width: Number, height: Number): void
                {
                        _width = width;
                        _height = height;
                }
 
                public override function get width(): Number
                {
                        return _width;
                }
 
                public override function get height(): Number
                {
                        return _height;
                }
        }
}

Каким образом спрайт узнает размеры своих child?

Добавлено через 2 часа 53 минуты
У моей задачи есть 2 пути решения:

I.
1) Уточнить как Sprite определяют размеры child.
2) Подделать значения размеров при помощи расширения класса Sprite.
3) Присвоить новый класс sprite2.

Таким образом фактический размер sprite2 будет соответствовать данным на нем, а parent будет считать, что sprite2 меньше.


II.
Так как box (sprite0) реагирует на свойство height sprite1, то:

1) Уточнить как происходит изменение размеров Sprite из-за child.
2) При изменении размеров проверить, чтобы они не были вызваны sprite2.
3) Подделать значения размеров.
4) Присвоить новый класс sprite1.

Таким образом фактический размер sprite1 будет соответствовать данным на нем, но:

* В случае изменения размеров, вызванных sprite2 - parent (box (sprite0)) будет получать подделанное значение и не будет добавлять скролл. Данные, выходящие за ограничения размеров будут спрятаны при помощи mask или scrollRect непосредственно в sprite2.

* В случае изменения размеров, вызванных не sprite2, а другими child - box получит реальные размеры и будет добавлять скролл.

Второй способ уже реализован, так как уже известно, как box (sprite0) определяет размеры child, и подделать эти значения можно.
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.display.DisplayObject;
 
        public class UnresizableSprite extends Sprite
        {               
                private var _width: Number;
                private var _height: Number;
                private var _ignoreList: Array;
 
                public function UnresizableSprite(width: Number, height: Number): void
                {
                        _width = width;
                        _height = height;
                }
 
                public function set ingoreList(ignoreList: Array): void
                {
                        _ignoreList = ignoreList;
                }
 
                override public function get width(): Number
                {
                        return _width;
                }
 
                override public function get height(): Number
                {
                        return _height;
                }
 
                override public function addChild(obj: DisplayObject): DisplayObject
                {
                        if (!isIgnored(obj.name))
                        {
                                if (obj.x + obj.width > _width)
                                {
                                        _width = obj.x + obj.width;
                                }
 
                                if (obj.y + obj.height > _height)
                                {
                                        _height = obj.y + obj.height;
                                }
                        }
 
                        return (super.addChild(obj));
                }
 
                private function isIgnored(name: String): Boolean
                {
                        if (!_ignoreList)
                                return false;
 
                        var i: uint;
                        var len: uint = _ignoreList.length;
 
                        for (i = 0; i <= len - 1; i++)
                                if (_ignoreList[i] == name)
                                        return true;
 
                        return false;
                }
        }
}



Мне более импонирует первое решение - оно более логично, но, увы, пока не могу найти ответ на свой вопрос - как стандартный класс Sprite определяет размеры своих child?


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

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