Как исправить эту потенциальную ошибку с компонентом ComboBox во Flash?

Когда я добавляю компонент ComboBox в Sprite, высота контейнера больше, чем должна.

Вот что я имею в виду:

import fl.controls.ComboBox;
//add combo box inside a container sprite
var combo:ComboBox = new ComboBox();
var container:Sprite = new Sprite();
addChild(container);
container.addChild(combo);
//draw the outline of the container sprite
container.graphics.lineStyle(1,0x009900);
container.graphics.drawRect(0,0,container.width,container.height);
//I don't get this:
trace(combo.height);//outputs 22
trace(container.height);//outputs 101

Примечание. Вам понадобится компонент ComboBox в вашей библиотеке. Я использую для этого Flash CS3.

Если я аннулирую / перерисовываю, вот так:

combo.invalidate(InvalidationType.ALL,true);
combo.drawNow();

высота меняется от 101 до 104.

Какие-нибудь решения?

ОБНОВЛЕНИЕ: я перезаписал метод configUI в подклассе ComboBox, но измерения все время верны. Почему высота контейнера меняется на 100?


person George Profenza    schedule 06.09.2010    source источник


Ответы (6)


Это из-за глупой имплантации Adobe компонентов Flash: если вы посмотрите на 2-й кадр компонента внутри Flash IDEA, вы увидите временный аватар, который возвращает исходный размер.

введите описание изображения здесь

чтобы решить эту проблему, вы должны перебрать дочерние аватары и нормализовать их размер:

public static function normalizedComponent(component:Sprite):void {
    for (var i:int = 0; i < component.numChildren; i++) {
        component.getChildAt(i).height = component.height;
        component.getChildAt(i).width = component.width;
    }
}

использование:

var comboBox:ComboBox = new ComboBox();
normalizedComponent(comboBox);
normalizedComponent(comboBox.textField);
person Shlomi Schwartz    schedule 13.11.2012
comment
Звучит довольно точно (+1). Позже попробую, спасибо за это! - person George Profenza; 13.11.2012
comment
конечно, я просто столкнулся с той же проблемой и натолкнулся на ваш вопрос, как только я ее решил, я хотел поделиться знаниями;) - person Shlomi Schwartz; 14.11.2012

"если он открыт, то высота с выпадающим списком"

Хм, я думаю, когда список добавляется в displayList под кнопкой, на самом деле он добавлен, и появляется всплывающее окно. Таким образом, высота должна оставаться высотой кнопки, поскольку спрайт никогда не будет содержать раскрывающегося списка.

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

Простым решением было бы дождаться события creationComplete / added и посмотреть, какова конечная высота, а затем нарисовать границу.

person Guillaume Malartre    schedule 30.09.2010
comment
Я посмотрел скины компонентов: компонент списка 100x100. Я создал подклассы ComboBox и в методе configUI «переопределения» установил высоту 22 (setSize). Если я рисую границу в обработчике событий для Event.ADDED, запускаемого полем со списком, граница по-прежнему выглядит неправильно. Я добавил таймаут на 335 миллисекунд, и это, похоже, работает, но это временное решение. - person George Profenza; 30.09.2010
comment
Взгляните на метод validateNow () help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/fl/ - person Guillaume Malartre; 30.09.2010

Я не думаю, что это ComboBox исключительная ошибка.

Когда я добавляю компонент Button в Sprite контейнер, я также получаю разные результаты при отслеживании кнопки и размеров контейнера. Фактически, я получаю такие же 100 x 100 результаты.

Я бы отказался от возможности раскрывающегося списка, поскольку у компонента Button его нет.

Я думаю, что обходной путь будет таким же для двух объектов компонентов (ComboBox и Button), но я пока не нашел решения. Буду обновлять, когда сделаю.

ОБНОВЛЕНИЕ:

Мне удалось заставить это работать с помощью validateNow(), а через несколько минут я нашел следующую ссылку: http://forums.adobe.com/message/816912?tstart=0

По сути, ссылка инструктирует нас поместить вызов validateNow() в событие EnterFrame или в SetTimeout с правильным временем.

person Luciano Santana    schedule 29.01.2011
comment
Одна вещь, которая сработала для меня, - это небольшой грязный прием: я использовал Timer / setTimeout и примерно через 650 мс я начал использовать измерения, которые верны. Я попытался уменьшить это число, но он стал нестабильным ... также количество кода / графики, которое необходимо инициализировать в этой области, также влияет на время, необходимое для перерисовки. Опять же, это грязный прием. Я хотел бы иметь чистое решение, которое я мог бы отметить / проголосовать / и т. Д. - person George Profenza; 29.01.2011
comment
Вы ответили, пока я редактировал сообщение. Но спасибо, чувак! Как я уже говорил ранее, в конце концов, validateNow () сама по себе выполнила свою работу. ;-) В субботу вечером кодеры? - person Luciano Santana; 29.01.2011

Итак - я предполагаю, что отображаемая высота ComboBox - это фактическая высота - т.е. есть, если он открыт, то высота С раскрывающимся списком, если нет, то БЕЗ. Однако - элементы ВСЕ ЕЩЕ присутствуют, хотя для .visible установлено значение false, что по-прежнему расширяет контейнер, даже если вы этого не видите ... Поэтому - я бы сказал:

container.graphics.drawRect(0, 0, combo.width, combo.height);

Так обычно и делают ...

person Aurel Bílý    schedule 06.09.2010
comment
Спасибо за вклад. Я пытаюсь собрать простой графический интерфейс. Я хочу использовать спрайты для выравнивания компонентов внутри них (по вертикали или горизонтали). Скажем, «контейнер» в моем примере будет содержать горизонтально выровненные компоненты. Если бы я добавил еще один контейнер под ним, я бы установил container2.y = container1.y + container.height, верно? Поскольку контейнер дает мне неправильные измерения, выравнивание контейнеров по вертикали не сработает. Насчет выпадающего списка, не уверен, что вы правы. Если я устанавливаю rowCount равным 2, это ничего не меняет и по умолчанию (закрыто) не добавляется - person George Profenza; 06.09.2010
comment
Тем не менее - это своего рода ошибка ... Может быть, раскрывающийся список .visible = false по умолчанию (до инициализации) установлен на какое-то значение, и он изменяется до нужного размера после ... Не уверен, хотя - ошибки, глюки - эти раздражающие вещи очень сложно реконструировать или даже удаленно понять, если у вас нет исходного кода и / или вы не можете отладить его должным образом. - person Aurel Bílý; 06.09.2010
comment
Похоже на ошибку. Источник доступен (например, / Applications / Adobe \ Flash \ CS3 / Configuration / Component \ Source / ActionScript \ 3.0 / User \ Interface). Исправление было бы потрясающим, но все, что я ожидаю, - это обходной путь. - person George Profenza; 06.09.2010
comment
а как насчет Flash CS5? - person Eugene; 07.09.2010
comment
@Eugene Просто попробовал :( Не повезло. Я проверил источник компонентов, и похоже, что он не сильно изменился со времен Flash CS3. Мне нужно погрузиться глубже и посмотреть, где компоненты flash измеряют дочерние спрайты / компоненты. - person George Profenza; 07.09.2010

можете ли вы настроить вручную перед этим кодом:

container.width=100;

container.height=100;

container.graphics.drawRect(0,0,container.width,container.height);

person Eugene    schedule 07.09.2010
comment
не совсем :( Если я установил высоту после добавления комбо, комбо будет уменьшено. Если я установлю высоту, прежде, пока в контейнер ничего не добавлено, она перейдет в 0 после того, как я добавлю комбо - person George Profenza; 07.09.2010
comment
объясните пожалуйста, какова ваша настоящая цель? - person Eugene; 07.09.2010
comment
Я хочу создать простой графический интерфейс с некоторыми комбинированными списками, вводом текста и т. Д. Я начал добавлять компоненты на сцену, но с этим возникли проблемы, поэтому я решил нарисовать графический интерфейс из кода. Я просто вкладываю спрайты и пытаюсь выровнять их, чтобы получить поведение типа HBox / VBox. На данный момент у меня проблемы с мерами из-за ComboBox. - person George Profenza; 13.09.2010
comment
что, если я посоветую вам использовать mxml гибко, я думаю, что он будет более мощным для достижения ваших целей. Не могли бы вы объяснить, какой компонент / графический интерфейс вы пытаетесь создать? - person Eugene; 13.09.2010

Привет, я нашел где-то решение аналогичной проблемы с NumericStepper.

и решение было:

var tInput:TextInput = numericStepper.getChildAt(2) as TextInput;
tInput.textField.height = 22; 

В вашем случае попробуйте следующее:

var tInput:TextInput = combo.getChildAt(1) as TextInput;
tInput.textField.height = 22; 
person Sanjay Bharati    schedule 11.11.2010
comment
Привет @Sanjay. Боюсь, я не совсем понимаю ссылку. Итак, вы получаете доступ к TextInput внутри компонента NumbericStepper и явно устанавливаете высоту 22? Я попробую решить свою проблему и посмотрю, как все пойдет. - person George Profenza; 11.11.2010