Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Пропорциональное изменение ширины у загруженного объекта и его дочерних элементов (http://www.flasher.ru/forum/showthread.php?t=160208)

BornTOFree 10.07.2011 07:52

Пропорциональное изменение ширины у загруженного объекта и его дочерних элементов
 
Вложений: 2
Загружаю swf с изображением кнопки. Внутри большой кнопки находятся ещё две маленькие кнопки
Вложение 26805
Нужно растягивать по ширине только саму основу кнопки не меняя размеры двух маленьких кнопок.

Кнопки в итоге собой представляют некий список и находятся все в едином контейнере.
Вложение 26806

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

spooner 10.07.2011 08:56

Очевидно менять только ширину основы кнопки, а не самой кнопки и уж тем более не контейнера.

BornTOFree 10.07.2011 11:28

Тогда придется каждую кнопку в отдельности ресайзить, т.к. кнопки могут как удаляться, так и добавляться в контейнер (число их не ограничивается).
Я думаю есть более продуктивный способ, к примеру, изменив ширину основы у одной кнопки, все остальные кнопки об этом узнали и тоже изменили ширину.
Может есть другие варианты?

По началу я пытался использовать scale9grid, но у меня он совершенно не работал, возможно потому что в этой ситуации он не пригоден.

spooner 10.07.2011 12:38

Если вам надо чтобы растягивался только фон, то и растягивать надо только фон.
Другой вопрос как вы это организуете.
Можно set-функцию сделать в классе, в которой регулировать ширину фона, можно в конструктор класса входным параметром ширину загнать, можно кастомное событие с параметром ширины рассылать всем кнопкам или типа того.
Но что то мне подсказывает, что с классами, а тем более кастомными событиями вы не сталкивались еще.

Wolsh 10.07.2011 13:11

Цитата:

Тогда придется каждую кнопку в отдельности ресайзить
Надо писать свой класс кнопки. Переопределить сеттер width, в котором собственно растягивать со scale9grid (или перерисовывать) фон и перераспределять элементы - что-то прижато вправо, что-то влево. Вобщем стандартная "резинка". Тогда при добавлении в контейнер стандартно подгоняем ширину кнопки под ширину контейнера, вызывая button.width = container.width, но кнопка растягивается так, как Вы ее запрограммировали - элементы не растягиваются, а перестраиваются.

BornTOFree 12.07.2011 18:08

Цитата:

Но что то мне подсказывает, что с классами, а тем более кастомными событиями вы не сталкивались еще.
Что такое классы, инкапсуляция и прочее я знаю :)

Вот, что такое кастомное событие без понятия, или вы имеете в виду флешевую диспетчерезацию? Можно по подробнее.

Wolsh, ресайз одной кнопки, это как бы не проблема. Вопрос в том, как ресайзить их все разом не делая при этом лишних телодвижений.
Я, к сожалению, не понял сакраментальной необходимости в сеттере, поэтому разродился на два своих варианта, но я уверен, что можно все организовать гораздо более верным способом, надеюсь на понимание.

Перерисовывать графику кнопки/кнопок нет необходимости, так как, повторюсь, кнопки грузятся из свф

Первый вариант
Класс CList - реализует список кнопок ->>
Код AS3:

for(var i:int = 0; i < 4; i++){
 
        cListView = new CListView();
        addChild(cListView);
        cListView.y = Number(cListView.height)*i;
        arrTitle.push(cListView);
 
}
 
public function updateWidth(value:int):void {
        for each (var obj:Object in arrTitle) {
                obj.widthFoo(value)
        }
 
}

Класс CListView визуальное представление кнопки.
В цикле создаются экземпляры кнопок и записываются ссылками в массив.
Метод updateWidth() вызывается, когда изменяется ширина окна в котором находятся кнопки, которые так же должны менять свою ширину(ширина кнопок идентична ширину окна).
При помощи цикла фор ич у всех экземпляров через ссылки вызывается метод widthFoo() в классе кнопки CListView и передаются новые размеры окна.

Этот вариант мне кажется не верным, т.к. необходимо очень часто вызывать метод updateWidth() и соответственно цикл.

Второй вариант


Класс CList - реализует список кнопок ->>
Код AS3:

for(var i:int = 0; i < 4; i++){
 
        cListView = new CListView();
        addChild(cListView);
        cListView.y = Number(cListView.height)*i;
 
}
public function updateWidth(value:int):void {
        CListView._value = value
}

Здесь не нужен массив, а в методе updateWidth() не требуется цикл. В место этого в методе вызывается обновление статической переменной класса CListView регулирующей ширину кнопки.

Но для того чтобы актуальная информация этой переменной была реализована, в классе кнопки CListView вызывается enterframe постоянно, что очень напрягает, как меня так и процессор, тем более если учесть, что кнопок этих может быть значительное кол-во.

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

Wolsh 12.07.2011 22:26

Цитата:

Я, к сожалению, не понял сакраментальной необходимости в сеттере..
А я не понял, зачем Вам метод с инопланетным названием "widthFoo", правильно меняющий ширину кнопки, и ПЛЮС правильный стандартный сеттер .width, делающий из кнопки уродца. Но это дело вкуса. Кто-то еще свою фамилию к названию метода добавляет)))))
Свойство height класса CListView Вы же переопределили (иначе зачем это странное приведение Number к Number). Почему же не сделать один правильный сеттер width, правильно меняющий ширину?
Цитата:

Было бы интересно прочитать комментарии по этим вариантам.
По второму и говорить нечего, Вы это сами прекрасно понимаете. Не думаю что стал бы работать в приложении, непрерывно изменяющем вид кнопок 30 раз в секунду. Меняться они будут только в момент ресайза сцены или контейнера, а жрать процессор и память - все время. С каких пор массив на сотню значений максимум и цикл с сотней итераций стали тяжелыми для плеера? Это пушинка по сравнению с тем восьмиэтажным вибрирующим механизмом событий/запросов 30 раз/сек для каждой кнопки, который, хвала создателям, "пока не актуален".

BornTOFree 14.07.2011 21:39

Цитата:

Кто-то еще свою фамилию к названию метода добавляет)))))
:D
Я предпочитаю имя-отчество.

function creatChildGenadiyVasilevich():void {
bornChildOlgaNikolaevna()
}

function bornChildOlgaNikolaevna():void {
bornChildName(NikitaVasilevich)
}

Извините, за срамной код, это черновик, я не особо задумываюсь над названием методов, хотя это целая наука) во время рефакторинга постараюсь все исправить.
Цитата:

зачем это странное приведение Number к Number
Там у меня видимо стринговое значение затесывалось, поэтому и приводил к числу.


Цитата:

Почему же не сделать один правильный сеттер width, правильно меняющий ширину?
Я не пойму, вы имеете в виду такую конструкцию:
Если кнопку рисовать, а не грузить, код в классе кнопки ->>
Код AS3:

public function set widthFoo(value:int):void{
        g.clear();
        g = this.graphics;
        g.beginFill(0xFFFFFF);
        g.drawRect(0,0,value,20);
        g.endFill();
}

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

Цитата:

С каких пор массив на сотню значений максимум
100 не максимум, предел около 1000. В прочем и с 1000 экземпляров все работает вполне шустро, конечно, притормаживания заметны, но это если учесть, что и оптимизации по видимым/невидимы кнопкам нет, ресайзится вся 1000.

Но мне этот вариант с частым вызовом цикла, все-таки не нравится. Ведь он вызывается постоянно, когда я зажимаю кнопку для растягивания окна и веду мышь (mouseMove)

С вибрирующем восьмиэтажным механизмом вы в точку попали :) так и есть.

Если у вас найдется время, покажите примерно, что вы имеете в виду под правильным сеттером, я видимо чего-то не понимаю. Пусть до меня и не все доходит, что вы предлагаете, ваши ответы каким-то магическим образом помогают выбрать правильный путь :)

Wolsh 14.07.2011 22:24

Код AS3:

public override function set width(value:int):void{
        g = this.graphics;
        g.clear();
        g.beginFill(0xFFFFFF);
        g.drawRect(0,0,value,20);
        g.endFill();
        // так же здесь переставляем внутренние элементы по новым местам
}

Ну и теперь нам не надо фу.
Код AS3:

obj.width = value;

И вообще, кто бы откуда ни попытался изменить ширину кнопки, получит ее правильно преобразованной - расширенной, а не растянутой. Никакого предательского метода width теперь просто нет. Есть только правильный.
И если честно, я не понял почему обязательно перерисовывать (хотя сам всегда так и делаю, но я вообще не пользуюсь IDE, то есть рисую все кодом или встраиваю битмап). Растягивать клипик, засунутый на фон в кнопку, думаю ничем не сложнее. Надо только дать ему имя и включить enable 9Grid scaling, если надо.


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

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