Компонент AutoSizing Flex Mobile Spark textarea

Я хочу сделать свой компонент mobile Spark textarea для обертывания всего содержимого. Я нашел способ сделать это mx_internal, но я не могу вызвать метод mx_internal :: getTextField (). NumLines - такого нет ... Кто-нибудь, кто делал это раньше?


person Zaur Guliyev    schedule 16.05.2012    source источник
comment
Если вы нашли способ сделать это; но это не работает, я думаю, вам придется поделиться кодом, чтобы мы могли диагностировать, почему он не работает.   -  person JeffryHouser    schedule 16.05.2012
comment
Я пытался назначить heightInLine = {NaN} - это работает в предыдущих версиях, но не работает в 4.6. И еще один способ, который я пробовал, - это создать новый скин без прокрутки, но IDE выдала мне ошибку, из-за которой не удалось найти скроллеры в определении. Так что я прошу еще какие-нибудь предложения?   -  person Zaur Guliyev    schedule 17.05.2012
comment
Вероятно, это связано с тем, что 4.6 использует StageText вместо Flash TextField. В 4.6, если вы вернетесь к старым скинам, я уверен, что это сработает. У меня нет времени искать конкретные названия скинов, но я думаю, что недавно писал об этом в блоге Flextras.   -  person JeffryHouser    schedule 17.05.2012


Ответы (2)


Вот решение для мобильных устройств:

for(var i:int=0; i < StyleableTextField(txt_genel.textDisplay).numLines; i++) {
        ta_height += StyleableTextField(txt_genel.textDisplay).getLineMetrics(i).height;
}
txt_genel.height = ta_height;
person Zaur Guliyev    schedule 21.05.2012

Вот решение с небольшим настраиваемым классом TextArea, есть комментарии, чтобы объяснить немного больше.

package
{   
    import mx.events.FlexEvent;

import spark.components.TextArea;
import spark.components.supportClasses.StyleableStageText;
import spark.events.TextOperationEvent;

public class CustomTextArea extends TextArea
{

    private var _lineNumber:int = 1;
    private var _padding:int;
    private var _minHeight:int;

    public function CustomTextArea()
    {
        super();

        addEventListener(FlexEvent.CREATION_COMPLETE, function setBehaviour(event:FlexEvent):void
        {
            //minHeight to prevent textarea to be too small
            _minHeight = height;
            //padding between textarea and text component inside to calculate line number
            _padding = ((textDisplay as StyleableStageText).x - x) + (width - (textDisplay as StyleableStageText).width);
            //listener for text changing
            addEventListener(TextOperationEvent.CHANGE, setHeight);
        });
    }

    private function setHeight(event:TextOperationEvent):void
    {
        //line number is textwidth divided by component width
        _lineNumber = (((textDisplay as StyleableStageText).measureText(text).width + _lineNumber * _padding) / width) + 1;
        //text height is line number * text height
        var newHeight:int = _lineNumber * (textDisplay as StyleableStageText).measureText(text).height;
        //if new height > min height, set height
        if (newHeight > _minHeight)
            height = newHeight;
    }
}
}

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: при большом количестве строк высота TextArea слишком увеличивается. Следует управлять.

person jpicard    schedule 20.05.2012
comment
он генерирует исключение в строке _padding = ((textDisplay as StyleableStageText) .x - x) + (width - (textDisplay as StyleableStageText) .width); исключение: Невозможно получить доступ к свойству или методу ссылки на пустой объект. - person Zaur Guliyev; 21.05.2012
comment
Вот как я использую его в mxml: ‹component: CustomTextArea id = txt_genel width = 100% skinClass = spark.skins.mobile.TextAreaSkin textAlign = left fontFamily = _typewriter contentBackgroundAlpha = 0 borderVisible = false editable = false /› - person Zaur Guliyev; 21.05.2012
comment
И сценарий действия, в котором я назначаю ему текст: StyleableTextField (txt_genel.textDisplay) .htmlText = ozet ['genelbilgiler'] как String; - person Zaur Guliyev; 21.05.2012
comment
И еще одно: когда я закомментировал эту строку заполнения и удалил ссылки на заполнение в вычислениях setHeight, она не переносила весь текст - так что он ведет себя как любая текстовая область - без разницы - person Zaur Guliyev; 21.05.2012
comment
Я нашел простое решение .. Все равно спасибо! - person Zaur Guliyev; 21.05.2012
comment
Хорошо, рада за тебя! Сожалею, что не видел ваших комментариев раньше, но если у вас есть решение, это прекрасно :) Возможно, ваше исключение было связано с тем, как вы использовали мой компонент, потому что я тестировал его с минимальными атрибутами. - person jpicard; 21.05.2012
comment
Просто подумайте, причиной «ссылки на нулевой объект» был ваш textDisplay - StyleableTextField, мой - StyleableStageText. - person jpicard; 23.05.2012