У меня есть приложение, в котором некоторый текст расширяется из центра TextField по одной букве за раз. Он работает нормально, пока нет пробелов, но как только пробел достигается в строке, он игнорируется до тех пор, пока не будет достигнут пробел, после чего текст центрируется в TextField.

myText - это текстовое поле в рабочей области с центрированным текстом в качестве выравнивания по умолчанию.

// Write the words
var charBetweenWords:String = " ";
var whatToWrite:String = "THERE ARE 200 BARRELS OF OIL IN ONE TANKER TRUCK";
whatToWrite = whatToWrite.split(" ").join(charBetweenWords);
var wordTimer:Timer = new Timer(100, 1);
wordTimer.addEventListener(TimerEvent.TIMER_COMPLETE, wordHandler);
function wordHandler(e:TimerEvent)
{
    if (whatToWrite.length > 0)
    {
        myText.appendText(whatToWrite.substr(0, 1));
        whatToWrite = whatToWrite.substr(1);
        wordTimer = new Timer(5, 1);
        wordTimer.addEventListener(TimerEvent.TIMER_COMPLETE, wordHandler);
        wordTimer.start();
    }
    else
    {
        // Done
    }
}
wordTimer.start();

Я рассматривал возможность замены пробелов символом, не являющимся пробелом (но все же пробелом), например / u0020, но шрифт, который я использую, не поддерживает этого. Когда я это делаю, пробелы вообще не появляются (но след whatToWrite возвращает поля между словами).

Flash IDE не центрирует текст с учетом пробелов в конце. myText помещается во Flash IDE и не инициализируется в коде.

Что я могу сделать, чтобы это работало?

2
Olin Kirkland 5 Янв 2016 в 19:17

2 ответа

Лучший ответ

Возможно, есть лучший способ (было бы здорово, если бы кто-то нашел лучший способ), но на данный момент это решение / хак, который я придумал: (только одна строка)

var whatToWrite:String = "THERE ARE 200 BARRELS OF OIL IN ONE TANKER TRUCK";    
var wordTimer:Timer = new Timer(100, 1);
wordTimer.addEventListener(TimerEvent.TIMER, wordHandler);

//set the the auto size to left so the width matches the text width
myText.autoSize = TextFieldAutoSize.LEFT;

function wordHandler(e:TimerEvent)
{
    if (whatToWrite.length > 0){
        //if the new character to add is a space, replace it with an underscore
        var newChar:String = whatToWrite.substr(0, 1);
        var charToAdd = newChar == " " ? "_" : newChar;
        myText.appendText(charToAdd);

        whatToWrite = whatToWrite.substr(1);

        wordTimer.reset();
        wordTimer.delay = 150;
        wordTimer.start();

        //center the text field manually
        myText.x = (stage.stageWidth - myText.width) * 0.5;

        //if it was originally a space, take off the underscore and make it a space again.
        if(newChar == " ") myText.text = myText.text.substring(0,myText.text.length-1) + " ";

    }
    else
    {
        // Done
    }
}

wordTimer.start();

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

2
BadFeelingAboutThis 5 Янв 2016 в 17:39

Лучше было бы создать собственный класс и использовать маскировку с полным текстовым полем, которое вставляется внутрь. По мере того, как текстовое поле скользит в, вы расширяете размер настраиваемого класса, и вы получите более плавный результат. Но в любом случае вы можете получить очень точный результат, используя класс TextLineMetrics, который дает кучу информации обо всех символах в тексте. Более простой способ - получить границы символов:

import flash.geom.Rectangle;

var whatToWrite:String = "THERE ARE 200 BARRELS OF OIL IN ONE TANKER TRUCK";
var wordTimer:Timer = new Timer(25);
wordTimer.addEventListener(TimerEvent.TIMER, wordHandler);
wordTimer.start();
var textWidth:Number = 0;
function wordHandler(e:TimerEvent)
{
    if (whatToWrite.length)
    {
        myText.appendText(whatToWrite.substr(0, 1));
        var rect:Rectangle = myText.getCharBoundaries(myText.text.length - 1)       
        textWidth += rect.width;        
        myText.width = textWidth + 5//compensate for rect with + 5
        whatToWrite = whatToWrite.substr(1);
        myText.x = stage.stageWidth / 2 - myText.width / 2
    }
    else
    {
        wordTimer.stop();
    }
}
1
BotMaster 5 Янв 2016 в 17:56