Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Как реализовать выбор-подстановку как у Гугла? (http://www.flasher.ru/forum/showthread.php?t=148032)

Astraport 20.12.2010 10:13

Как реализовать выбор-подстановку как у Гугла?
 
У Гула переводчика (http://translate.google.ru) на днях появилась новая фича - можно кликнуть по слову в переводе и откроется список из вариантов, кликнув по которому производится замена слова.

У меня совсем другое, но нужно реализовать что-то подобное. Имеется несколько массивов из первых элементов которых формируется фраза, например "Хорошо в деревне летом", т. е. каждое слово - это первый элемент каждого массива. Мне нужно, чтобы при наведении на каждое слово оно превращалось в элемент DropDownList с элементами соответствующего массива и по клику это слово заменялось. Например, кликнув по "Хорошо" появляется список из вариантов из первого массива: "Хорошо", "Плохо", "Скучно", "Весело". Кликнули по "Весело" - получилась фраза "Весело в деревне летом". Ну и так с каждым словом.

Вот как подобное лучше реализовать? Думал над ItemRenderom, но ума не приложу как его можно вставить например в Label.

GBee 20.12.2010 10:47

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

Или сразу создаете толпу комбобоксов задаете им стиль, чтоб сливался с окружающей средой.

Astraport 20.12.2010 10:51

Ну вот допустим первоначальная фраза у меня в Label. И как можно найти размеры и местоположение отдельно взятого слова?

GBee 20.12.2010 11:57

Тут я не помогу, вроде есть какие-то методы getBounds или measureText. Лучше в хелпе поискать или дождаться кого-нить, кто знает.

Добавлено через 4 минуты
Вот вариант getCharBoundaries() у textField, правда textField протектная поляна, наследуйтесь, исследуйте.

Astraport 20.12.2010 12:33

GBee, спасибо, посмотрю.
Может быть проще создать HBox и туда вставлять объекты label при наведении на которые они становятся невидимыми, но появляется comboBox с данными массива и при выборе итема, значение его передается в этот label.
Проблема только в том, что у меня места для этого HBox мало, всего 250 пикселей, а фраза может состоять и из 10 слов.
Сейчас буду пробывать.

Silicium 20.12.2010 12:46

А если с состояниями поколдовать? Одним компонентом обойтись.

Astraport 20.12.2010 13:58

Цитата:

А если с состояниями поколдовать? Одним компонентом обойтись.
Даже не представляю как можно обойтись одним компонентом?

PikseL 21.12.2010 08:01

Что-то типа:
Код AS3:

var s:String = yourLabel.text;
var m:TextLineMetrics = yourLabel.measureText(s);
trace(m.width + ':' + m.height);


Astraport 21.12.2010 10:10

Цитата:

Что-то типа:
Для flash это да, тоже смотрел, а для flex вполне Hgroup нормально расставляет label.

Что-то я разучился как элементы создавать. Пробую так как в коде ниже, пишет, что объекта с именем например combo1 не существует (null), хотя его создание трейсится.

Код AS3:

        <fx:Script>
                <![CDATA[
                        import mx.collections.IList;
 
                        import spark.components.ComboBox;
                        import spark.components.Label;
 
                        private var newLabel:Label;
                        private var newCombo:ComboBox;
                        private var myArray1:Array = ['Хорошо','Плохо','Весело','Скучно'];
                        private var myArray2:Array = [' в',' на',' у',' под'];
                        private var myArray3:Array = [' деревне',' городе',' селе',' море'];
                        private var myArray4:Array = [' летом.',' зимой.',' всегда.',' никогда.'];
 
                        protected function button1_clickHandler(event:MouseEvent):void
                        {
                                var tempArray:Array = new Array();
                                        tempArray.push(myArray1[0]);
                                        tempArray.push(myArray2[0]);
                                        tempArray.push(myArray3[0]);
                                        tempArray.push(myArray4[0]);
                                for (var i:int =0; i<tempArray.length; i++){
                                        newLabel = new Label();
                                        newLabel.text = tempArray[i];
                                        newLabel.name = 'name' + i;
                                        labelG.addElement(newLabel);
                                        newCombo = new ComboBox();
                                        newCombo.x = newLabel.x;
                                        newCombo.visible = false;
                                        newCombo.name = 'combo' + i;
                                        newCombo.dataProvider = myArray1 as IList;
                                        labelG.addElement(newCombo);
                                        newLabel.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
                                        newLabel.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
                                }
                        }
 
                        protected function onMouseOver(event:MouseEvent):void
                        {
                                event.currentTarget.visible = false;
                                var currName:String = event.currentTarget.name;
                                trace ('currName ' + currName.charAt(4));
                                var currCombo:ComboBox = this.getChildByName('combo'+currName.charAt(4)) as ComboBox;
                                currCombo.visible = true;
                        }
                        protected function onMouseOut(event:MouseEvent):void
                        {
 
                        }
 
                ]]>
        </fx:Script>
 
        <fx:Declarations>
 
        </fx:Declarations>
        <s:HGroup x="32" y="92" width="670" height="27" id="labelG">
        </s:HGroup>
        <s:Button x="32" y="157" label="Сформировать фразу" click="button1_clickHandler(event)"/>

И ещё вопрос параллельно. Как можно обратиться к переменной по имени? Чтобы вот эту конструкцию заменить на цикл перебирая: myArray1, myArray2 и т. д.:

Код AS3:

tempArray.push(myArray1[0]);
tempArray.push(myArray2[0]);
tempArray.push(myArray3[0]);
tempArray.push(myArray4[0])

;

alatar 21.12.2010 12:09

Что-бы что-то достать, надо сначала это что-то положить. У вас ComboBox никуда не добавляется.
Цитата:

Чтобы вот эту конструкцию заменить на цикл перебирая: myArray1, myArray2 и т. д.:
Сложить их в массив.


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

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