Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.07.2011, 07:52
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 1  
Ответить с цитированием
BornTOFree

Регистрация: Oct 2010
Сообщений: 85
По умолчанию Пропорциональное изменение ширины у загруженного объекта и его дочерних элементов

Загружаю swf с изображением кнопки. Внутри большой кнопки находятся ещё две маленькие кнопки
Название: buttonLink.jpg
Просмотров: 278

Размер: 4.9 Кб
Нужно растягивать по ширине только саму основу кнопки не меняя размеры двух маленьких кнопок.

Кнопки в итоге собой представляют некий список и находятся все в едином контейнере.
Название: buttonLink2.jpg
Просмотров: 274

Размер: 19.3 Кб

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

Старый 10.07.2011, 08:56
spooner вне форума Посмотреть профиль Отправить личное сообщение для spooner Найти все сообщения от spooner
  № 2  
Ответить с цитированием
spooner
 
Аватар для spooner

Регистрация: Mar 2009
Сообщений: 207
Очевидно менять только ширину основы кнопки, а не самой кнопки и уж тем более не контейнера.

Старый 10.07.2011, 11:28
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 3  
Ответить с цитированием
BornTOFree

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

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

Старый 10.07.2011, 12:38
spooner вне форума Посмотреть профиль Отправить личное сообщение для spooner Найти все сообщения от spooner
  № 4  
Ответить с цитированием
spooner
 
Аватар для spooner

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

Старый 10.07.2011, 13:11
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Тогда придется каждую кнопку в отдельности ресайзить
Надо писать свой класс кнопки. Переопределить сеттер width, в котором собственно растягивать со scale9grid (или перерисовывать) фон и перераспределять элементы - что-то прижато вправо, что-то влево. Вобщем стандартная "резинка". Тогда при добавлении в контейнер стандартно подгоняем ширину кнопки под ширину контейнера, вызывая button.width = container.width, но кнопка растягивается так, как Вы ее запрограммировали - элементы не растягиваются, а перестраиваются.
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 10.07.2011 в 13:15.
Старый 12.07.2011, 18:08
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 6  
Ответить с цитированием
BornTOFree

Регистрация: Oct 2010
Сообщений: 85
Цитата:
Но что то мне подсказывает, что с классами, а тем более кастомными событиями вы не сталкивались еще.
Что такое классы, инкапсуляция и прочее я знаю

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

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 постоянно, что очень напрягает, как меня так и процессор, тем более если учесть, что кнопок этих может быть значительное кол-во.

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

Старый 12.07.2011, 22:26
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Я, к сожалению, не понял сакраментальной необходимости в сеттере..
А я не понял, зачем Вам метод с инопланетным названием "widthFoo", правильно меняющий ширину кнопки, и ПЛЮС правильный стандартный сеттер .width, делающий из кнопки уродца. Но это дело вкуса. Кто-то еще свою фамилию к названию метода добавляет)))))
Свойство height класса CListView Вы же переопределили (иначе зачем это странное приведение Number к Number). Почему же не сделать один правильный сеттер width, правильно меняющий ширину?
Цитата:
Было бы интересно прочитать комментарии по этим вариантам.
По второму и говорить нечего, Вы это сами прекрасно понимаете. Не думаю что стал бы работать в приложении, непрерывно изменяющем вид кнопок 30 раз в секунду. Меняться они будут только в момент ресайза сцены или контейнера, а жрать процессор и память - все время. С каких пор массив на сотню значений максимум и цикл с сотней итераций стали тяжелыми для плеера? Это пушинка по сравнению с тем восьмиэтажным вибрирующим механизмом событий/запросов 30 раз/сек для каждой кнопки, который, хвала создателям, "пока не актуален".
__________________
Reality.getBounds(this);

Старый 14.07.2011, 21:39
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 8  
Ответить с цитированием
BornTOFree

Регистрация: Oct 2010
Сообщений: 85
Цитата:
Кто-то еще свою фамилию к названию метода добавляет)))))

Я предпочитаю имя-отчество.

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)

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

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

Старый 14.07.2011, 22:24
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Код 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, если надо.
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:19.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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