Как добавить одну букву за раз в текстовое поле, как избежать переноса слов в середине слова? - PullRequest
1 голос
/ 26 декабря 2011

С учетом следующего примера SWF: Образец

Обратите внимание, что со словами «энтузиаст» в конце первой строки и «написать» в конце второй строки, чтоони начинают печатать в первой строке, но после нескольких букв они сталкиваются.

Я понимаю, что это правильное поведение, но есть ли способ для "энтузиаста" начать печататься во второй строке и "писать" в третьей строке вместо того, чтобы быть набитым во время набора?

В настоящее время я думаю о создании механизма поиска вперед, поэтому он находит следующее слово целиком, затем делает его активным для печати, временно его печатает, проверяет, увеличивает ли оно число строк и вставляет ли оноразрыв строки и продолжение записи.Но это кажется неудобным.

Код ниже:

import flash.text.TextField;
import flash.events.Event;

var tt:TextField = new TextField();
tt.wordWrap = true;
tt.width = 200;
tt.height = 50;
tt.border = true;

var s = "Stack Overflow is for professional and enthusiast programmers, people who write code because they love it. We feel the best Stack Overflow questions have a bit of source code in them, but if your question generally covers";
addChild(tt);

var currentLetter:int = 0;

addEventListener(Event.ENTER_FRAME, onEnter, false, 0, true);

function onEnter(e:Event):void 
{
    if(currentLetter < s.length)
    {
        tt.appendText(s.charAt(currentLetter));
    }
    currentLetter++;
}

1 Ответ

1 голос
/ 26 декабря 2011

немного скорректировал ваш код и опубликовал результат в wonderfl: http://wonderfl.net/c/rZkm

, поскольку @mouseas предложил, чтобы я поместил следующее слово в дополнительное текстовое поле, измерил ширину и сравнил это с оставшимся пространством в текущемстрока ... если следующее слово не подходит, я добавляю разрыв строки и продолжаю.

вот код:

package {
    import flash.geom.Rectangle;
    import flash.text.TextFieldAutoSize;
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.events.Event;

    public class FlashTest extends Sprite {

        private var currentLetter:int = 0;
        private var tt:TextField;
        private var debug:TextField;
        private var pre:TextField;
        private var s:String;

        public function FlashTest() 
        {
            // write as3 code here..
            tt = new TextField();
            tt.wordWrap = true;
            tt.width = 200;
            tt.height = 150;
            tt.border = true;

            s = "Stack Overflow is for professional and enthusiast programmers, people who write code because they love it. We feel the best Stack Overflow questions have a bit of source code in them, but if your question generally covers";
            addChild(tt);

            // predraw word
            pre = new TextField();
            pre.y = 150;
            pre.width = 200;
            pre.height = 50;
            pre.autoSize = TextFieldAutoSize.LEFT;
            pre.border = true;
            addChild(pre);

            // debug txt
            debug = new TextField();
            debug.x = 250;
            debug.wordWrap = true;
            debug.width = 200;
            debug.height = 500;
            debug.border = true;
            addChild(debug);

            addEventListener(Event.ENTER_FRAME, onEnter, false, 0, true);
        }

        private function onEnter(e:Event):void 
        {

            //debug.appendText("char: " + rect.x + " " + rect.width + "\n");
            var c:String = "";
            if (currentLetter < s.length)
            {
                c = s.charAt(currentLetter);
                tt.appendText(c);
            }
            else
            {
                debug.appendText("DONE! \n");
                removeEventListener(Event.ENTER_FRAME, onEnter);    
            }

            if (c == " ")
            {
                var rect:Rectangle = tt.getCharBoundaries(currentLetter-1);
                if (rect != null)
                {
                    //debug.appendText("char: " + rect + "\n");
                    var cPos:int = rect.x + rect.width;
                    var r:int = tt.width - 4 - cPos;  // 4px for gutter on left+right side of textfield 



                    var start:int = s.lastIndexOf(" ", currentLetter);
                    var end:int = s.indexOf(" ", currentLetter+1);
                    if (start < 0) start = 0;
                    pre.text = s.substr(start, end-start);

                    debug.appendText("rest: " + r + " " + pre.textWidth + " > " + pre.text + "\n");

                    if (r - pre.textWidth <= 0)
                    {
                        tt.appendText("\n");
                        debug.appendText("\n");
                    }

                    //debug.appendText("w:" + tt.textWidth + " " + start + "->"+ end + " /" + pre.text + "/ " + pre.textWidth + "\n");
                }
            }

            ++currentLetter;
        }
    }
}

отлично работает - только «а» в4-я строка создает проблемы - может быть, вам нужно немного подстроить вычисления ...

...