Контейнер Flex с плавающим стилем HTML

Я использую Flex 4 с компонентами Spark для создания мобильного приложения, и у меня есть HGroup, которую я использую для хранения всех моих элементов. Когда экран загружается, он втягивает небольшой объем текста, который будет отображаться, и просматривает все слова, чтобы увидеть, является ли какое-либо из них ключевым словом. Пока он зацикливается, я помещаю каждое слово в отдельный элемент метки, и если слово является ключевым словом, оно меняет несколько стилей и добавляет событие щелчка, чтобы показать описание слова.

Все работает нормально, но когда все добавляется в HGroup, остается только одна строка, и большая часть текста полностью обрезается, потому что она не переносит содержимое.

Мой вопрос: есть ли способ установить или расширить HGroup, чтобы разрешить перенос содержимого на его дочерние элементы?

Ниже приведены некоторые фрагменты кода того, что у меня есть:

Контейнеры MXML:

<s:VGroup id="answerData" width="580" height="700" horizontalAlign="center" paddingTop="5">
<s:HGroup id="theLabel" color="white" width="580" fontSize="25" paddingBottom="20" />
<s:HGroup id="theText" color="white" width="580" fontSize="25" maxWidth="580" />
</s:VGroup>

КАК создавать этикетки:

public static function setKeyWords(someText:String, theGroup:Group, theDictionary:Array, theView:Object):void {
        theGroup.removeAllElements();
        var textArray:Array = someText.split(' ');
        for(var i:int = 0, l:int = textArray.length; i < l; i++) {
            if(checkForWord(theDictionary, textArray[i].toString())) {
                var theLink:Label = new Label();
                theLink.text = textArray[i].toString();
                theLink.setStyle("color", "0xFFFF00");
                theLink.setStyle("fontWeight", "bold");
                theLink.maxWidth = 580;
                var tmpDescrip:String = theDescription;
                theLink.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
                    showToolTip(tmpDescrip, theView);
                });
                theGroup.addElement(theLink);
            } else {
                var someLabel:Label = new Label();
                someLabel.maxWidth = 580;
                someLabel.text = textArray[i].toString();
                theGroup.addElement(someLabel);
            }
        }
    }

person DSlagle    schedule 20.07.2011    source источник


Ответы (3)


Проблема, с которой я столкнулся, заключалась в том, что у меня было несколько ярлыков в VGroup, и мне нужно было их обернуть, а не выходить за пределы установленной ширины контейнеров. Я пытался интегрировать ключевые слова в динамический абзац текста. Я не мог использовать mx: Text, потому что мне нужно, чтобы каждое слово было отдельным компонентом, который позволял настраивать стиль и щелкать мышью, даже если слово было ключевым словом. Кроме того, решение для максимальных строк метки не будет работать, потому что я имею дело с несколькими метками в VGroup, а VGroup необходимо обернуть своих дочерних элементов, а не теги меток. Я также не мог использовать TileGroup, потому что это выглядит неправильно, разбивая абзац на компонент, похожий на таблицу, где каждое слово находится в своем собственном столбце / строке.

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

Ниже приведен код, который я использовал для решения этой проблемы, если кто-то еще столкнется с этой проблемой:

public static function setKeyWords(someText:String, theGroup:Group, theDictionary:Array, theView:Object):void {
        theGroup.removeAllElements();
        var textArray:Array = someText.split(' ');
        var theCount:int = 0;
        var theHGroup:HGroup = new HGroup();
        var breakNum:int = 40;
        theHGroup.percentWidth = 100;
        for(var i:int = 0, l:int = textArray.length; i < l; i++) {
            theCount += textArray[i].toString().length;
            if(theCount >= breakNum) {
                theGroup.addElement(theHGroup);
                theHGroup = new HGroup();
                theHGroup.percentWidth = 100;
                theCount = 0;
            }
            if(checkForWord(theDictionary, textArray[i].toString())) {
                theCount += 1;
                var theLink:Label = new Label();
                theLink.text = textArray[i].toString();
                theLink.setStyle("color", "0xFFFF00");
                theLink.setStyle("fontWeight", "bold");
                theLink.maxWidth = 580;
                //theLink.includeInLayout = false;
                var tmpDescrip:String = theDescription;
                theLink.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
                    showToolTip(tmpDescrip, theView, 'keywords');
                });
                theHGroup.addElement(theLink);
            } else {
                theCount += 1;
                var someLabel:Label = new Label();
                someLabel.maxWidth = 580;
                someLabel.text = textArray[i].toString();
                //someLabel.includeInLayout = false;
                theHGroup.addElement(someLabel);
            }
        }
        if(theCount > 0)
            theGroup.addElement(theHGroup);
    }

Возможно, это не самый эффективный способ сделать это, но он работает и требует мало времени для выполнения на Iphone, чего я и добивался.

person DSlagle    schedule 05.08.2011

Не совсем уверен, что понимаю ваш вопрос.

Если вы имеете в виду, что метки усечены, вы можете установить процент ширины и обернуть метки с помощью maxDisplayedLines:

someLabel.maxDisplayedLines = 10;

Если вы имеете в виду, что хотите, чтобы в макете группы были столбцы и строки, используйте TileGroup / TileLayout.

Если дочерние элементы вашей группы содержат составной контент, который должен плавать, может помочь какой-нибудь includeInLayout = false.

person Jason Sturges    schedule 20.07.2011

Если вы хотите, чтобы текст отображался в блоке из нескольких строк, используйте mx: Text с установленной шириной.
Чтобы отобразить что-то над HGroup, проще всего оставить HGroup в покое и просто сделать прозрачный контейнер (Canvas) над ним. Там вы сможете отображать что угодно (просто сделайте математику, чтобы расположить это правильно).

person alxx    schedule 20.07.2011