Просмотр полной версии : Как реализовать выбор-подстановку как у Гугла?
Astraport
20.12.2010, 10:13
У Гула переводчика (http://translate.google.ru) на днях появилась новая фича - можно кликнуть по слову в переводе и откроется список из вариантов, кликнув по которому производится замена слова.
У меня совсем другое, но нужно реализовать что-то подобное. Имеется несколько массивов из первых элементов которых формируется фраза, например "Хорошо в деревне летом", т. е. каждое слово - это первый элемент каждого массива. Мне нужно, чтобы при наведении на каждое слово оно превращалось в элемент DropDownList с элементами соответствующего массива и по клику это слово заменялось. Например, кликнув по "Хорошо" появляется список из вариантов из первого массива: "Хорошо", "Плохо", "Скучно", "Весело". Кликнули по "Весело" - получилась фраза "Весело в деревне летом". Ну и так с каждым словом.
Вот как подобное лучше реализовать? Думал над ItemRenderom, но ума не приложу как его можно вставить например в Label.
Жмакаете по слову,
находите его размеры и местоположение,
сверху комбобоксик подгоняете, у которого датапровайдер у вас уже есть
Или сразу создаете толпу комбобоксов задаете им стиль, чтоб сливался с окружающей средой.
Astraport
20.12.2010, 10:51
Ну вот допустим первоначальная фраза у меня в Label. И как можно найти размеры и местоположение отдельно взятого слова?
Тут я не помогу, вроде есть какие-то методы 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
А если с состояниями поколдовать? Одним компонентом обойтись.
Даже не представляю как можно обойтись одним компонентом?
Что-то типа:
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), хотя его создание трейсится.
<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 и т. д.:
tempArray.push(myArray1[0]);
tempArray.push(myArray2[0]);
tempArray.push(myArray3[0]);
tempArray.push(myArray4[0]);
Что-бы что-то достать, надо сначала это что-то положить. У вас ComboBox никуда не добавляется.
Чтобы вот эту конструкцию заменить на цикл перебирая: myArray1, myArray2 и т. д.:
Сложить их в массив.
Astraport
21.12.2010, 17:11
У вас ComboBox никуда не добавляется.
А разве этого мало? labelG.addElement(newCombo);
Сложить их в массив.
Так не интересно, а можно ли как-то обращаться к переменным по имени?
Типа:
getVariableByName('myArray'+i);
Ну если вы любитель таких путей...
this['myArray' + i];
Добавлено через 17 минут
А разве этого мало? labelG.addElement(newCombo);
С учетом того, что вы пытаетесь получить комбобокс не у labelG? Да мало.
this.getChildByName('combo'+currName.charAt(4))
Astraport
21.12.2010, 17:45
Ну если вы любитель таких путей...
Да, точно! Спасибо.
С учетом того, что вы пытаетесь получить комбобокс не у labelG? Да мало.
Извиняюсь, что-то с утра плохо соображал, спасибо.
Да, точно! Спасибо.
Не за что. Удачи при дебаге.
Astraport
21.12.2010, 18:02
Не за что. Удачи при дебаге.
Ну да:( То есть никак.
Что значит никак? Эта фраза относилась к отсутствию типизации и ошибкам при опечатках.
Сделайте поля публичными.
Astraport
21.12.2010, 19:51
Да, я решил проблему, спасибо. Просто сначала пытался так:
var tempArray:Array = new Array();
for (var j:int = 1; j<5; j++){
tempArray.push(this['myArray'+j+'[0]']);
}
Естественно это не сработало, но временный массив помог:)
Silicium
23.12.2010, 01:12
И все ровно в одном компоненте с двумя состояниями было бы легче все это сделать... я думаю.
А я бы делал текстареа + комбобокс сверху один.
По-большому счету тут и комбобокс лишний, хватило бы и списка.
По-большому счету тут и комбобокс лишний, хватило бы и списка.
Согласен
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.