PDA

Просмотр полной версии : Как отмасшабировать выпадающий список ComboBox ?


wolfenstein
03.06.2013, 10:04
Помещаю ComboBox в Sprite, затем изменяю размеры спрайта, в который помещён комбобокс, и получается вот такая беда:

см. изображение в прикреплении

Может кто сталкивался с таким?

C4Grey
03.06.2013, 11:02
Нужно просто найти элемент меню(dropdown) и отмасштабировать либо его, либо вложенные элементы, как описано ниже.
http://www.kirupa.com/forum/showthread.php?345077-combobox-s-dropmenu-scaling:
var combobox:ComboBox = _box;
combobox.dropdown.getChildAt(2).scaleY = combobox.dropdown.getChildAt(2).scaleX = this.scaleY;

this.addEventListener(Event.ENTER_FRAME, enterframe);
function enterframe(pEvent:Event):void{
combobox.dropdown.y = this.y + ((combobox.y + combobox.height) * this.scaleY);
Для позиционирования не обязательно использовать ENTER_FRAME, у ComboBox вроде есть событие открытия. Если все же нету - можно добавить слушатель события клика, он будет обработан после раскрытия.

wolfenstein
03.06.2013, 13:39
мне изачально пришла в голову такая же мысль

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

как мне видится наиболее приближённым решением что-то между этим:
this.list.y = this.localToGlobal(new Point(this.x, this.y) ).y - (this.height + this.startHeight)

и в от этим:
this.list.y = this.localToGlobal(new Point(this.x, this.y) ).y - (this.startHeight);

в примерах этого кода this - это это ссылка на класс, расширяющий класс ComboBox

печально конечно что это не окончальное решение. Вобщем нехватает какого-то коэффициента, на который нужно умножить или разделить

mooncar
03.06.2013, 14:20
А если компонент не масштабировать? Я точно не помню, к тому же речь о компоненте AS3, но разве у него нет нативного метода, изменяющего видимый размер?

Wolsh
03.06.2013, 14:45
А не так ли?
this.list.y = this.localToGlobal(new Point(this.x, this.y + this.startHeight)).y;

wolfenstein
03.06.2013, 15:35
А не так ли?
this.list.y = this.localToGlobal(new Point(this.x, this.y + this.startHeight)).y;

да, почти точно, спасибо

только там не прибавлять, а вычитать, тогда позиция выпадающего списка в самый аккурат получается:
this.list.y = this.localToGlobal(new Point(this.x, this.y - this.startHeight)).y;


осталось решить как поправить ширину и высоту выпадающего списка при масштабировании

Wolsh
03.06.2013, 16:02
Ну Вы могли сразу посчитать коэфициент масштабирования, запросив глобальные координаты точек this.x и this.x + this.width и узнав таким образом "новую" ширину, поделить ее на this.width — вот и скейл.

wolfenstein
03.06.2013, 16:32
Ну Вы могли сразу посчитать коэфициент масштабирования, запросив глобальные координаты точек this.x и this.x + this.width и узнав таким образом "новую" ширину, поделить ее на this.width — вот и скейл.

Спасибо : )

Получилось то что нужно:
var poinSize:Point = this.localToGlobal(new Point(this.x + this.width, this.y + this.height));
this.list.scaleX = (poinSize.x - this.list.x) / this.width;
this.list.scaleY = (poinSize.y - this.list.y) / this.height;

a.konigin
08.04.2016, 10:03
Простите за поднятие древней темы, однако столкнулся с такой же проблемой масштабирования. Увеличиваю спрайт на котором ComboBox, при этом видимая часть ComboBox'a увеличивается пропорционально скейлу спрайта, а выпадающий список остается такого же размера, как и до скейла. Не пойму что-то, как тс использовал код из предыдущего поста.

undefined
08.04.2016, 11:10
вроде у всех компонентов есть родной метод setSize, который точно знает как надо компонент тянуть

a.konigin
08.04.2016, 21:32
Не-а, setSize тоже не работает. Результат тот же.

caseyryan
08.04.2016, 23:06
Давно известно, что эти компоненты кривые. Используй сторонние. Самые крутые компоненты на чистом флеше, которые я находил - ASwing (https://github.com/ngrebenshikov/aswing/tree/master/AsWing). Порт джавовских компонентов Swing На AS3. Очень много всего, и очень круто сделано. Единственные недостаток - непривычный для флешеров API, который тоже перекочевал с джавы. Зато гуглить можно сразу по джавовским компонентам, если что-то непонятно как работает. Тут все так же