【问题标题】:How can I prevent this arbitrary text truncation in AS3如何防止 AS3 中的这种任意文本截断
【发布时间】:2011-12-28 17:42:27
【问题描述】:

下面是填充菜单的代码。一切似乎都很好,除了一个关键部分外,没有抛出任何错误。我的 megaPages 数组的值是 ["HOME","BABIES","BRIDALS","MISC","WEDDINGS","ABOUT"],但屏幕上显示的实际文本(由 megaPages 生成)是这样的:

如您所见,某些文本被任意截断。我已经跟踪了文本字符串,因为它们在菜单构建的各个阶段通过各种功能,它们总是正确的,但是当每个 DisplayObject 出现在屏幕上时,字母被省略了(注意,虽然'HOME' abd'关于'很好)。我什至不知道从哪里开始解决这个问题。

    function buildMenu() {
        var itemMCs = new Array();

        for (var i = 0; i < megaPages.length; i++) {
            megaPages[i] = megaPages[i].toUpperCase();
            trace(megaPages[i]); // at each iteration, traces as follows "HOME","BABIES","BRIDALS","MISC","WEDDINGS","ABOUT"
            var textMC = createText(megaPages[i]);

            var itemMC = new MovieClip();
            if (i!=0) {
                var newLink = new PlateLink();
                newLink.y = 0;
                itemMC.addChild(newLink);
            }


            var newPlate = new Plate();
            if (i==0) {
                newPlate.y = 0;
            } else {
                newPlate.y = newLink.height - 2;
            }
            newPlate.x = 0;
            newPlate.width = textMC.width + (plateMargin*2);
            itemMC.addChild(newPlate);

            if (i!=0) {
                newLink.x = (newPlate.width/2) - (newLink.width/2);
            }

            textMC.x = plateMargin;
            textMC.y = newPlate.y + .5;
            itemMC.addChild(textMC);

            itemMCs.push(itemMC);

            itemMC.x = (homeplateref.x + (homeplateref.width/2)) - (itemMC.width/2);
            if (i==0) {
                itemMC.y = homeplateref.y;
            } else {
                itemMC.y = itemMCs[i-1].y + (itemMCs[i-1].height - 6);
            }
            menuRef.addChild(itemMC);

        }

    }

    function createText(menuTitle) {

        trace(menuTitle);

        var textContainer : MovieClip = new MovieClip();

        var myFont = new Font1();

        var backText = instantText(menuTitle, 0x000000);

        backText.x = 1;
        backText.y = 1;

        var frontText = instantText(menuTitle, 0xFFFFFF);

        frontText.x = 0;
        frontText.y = 0;

        textContainer.addChild(backText);
        textContainer.addChild(frontText);
        return textContainer;
    }

    function instantText(textContent, color) {

        trace(textContent); // again, traces the right text each time it is fired

        var myFont = new Font1();
        var myFormat:TextFormat = new TextFormat();
        myFormat.size = 18;
        myFormat.align = TextFormatAlign.CENTER;
        myFormat.font = myFont.fontName;

        var myText:TextField = new TextField();
        myText.defaultTextFormat = myFormat;
        myText.embedFonts = true;
        myText.antiAliasType = AntiAliasType.ADVANCED;
        myText.text = textContent;
        myText.textColor = color;
        myText.autoSize = TextFieldAutoSize.LEFT;           
        trace(myText.text);

        return myText;
    }

【问题讨论】:

  • 看起来你需要嵌入字体
  • PlateLinkPlate 是什么?
  • Plate 和 PlateLink 是灰色方块的实例,以及每一位文本的链接链

标签: arrays actionscript-3 textfield


【解决方案1】:

您需要为您使用的字体嵌入所有必要的字符。

对于在 Flash 中创建的文本字段:
选择 TextField,然后点击属性面板中的“嵌入”按钮。

对于动态创建的文本字段:
当您将字体设置为导出时(在您的情况下为Font1),请确保包含您需要的所有字符。

您可以选择嵌入所有大写字符,或者只输入那些特定菜单项所需的字符。

【讨论】:

  • 我不确定我明白你在说什么。这些文本字段是通过 AS3 生成的,我的字体导出为类 Font1()。 Flash 创作程序中有什么文本字段,那么,我可以这样做吗?嵌入到底对我有什么作用?
  • 抱歉,我以为您使用 Flash 来创建文本字段。我会更新我的答案。
  • 是的,就是这样,我刚刚从库中 Font1 的属性中选择了“包含所有字符范围”。哇,我可能在这上面又花了 6 个小时却一无所知,谢谢!!!!
  • 为了节省 SWF 中的空间,Flash 仅包含您指定字体的字形。嵌入设置告诉 Flash 你需要哪些。
  • @ColinBrogan 包含字体的所有字形有点不必要,因为字体可能非常大,如果包含很多字体,它会加起来。对于您的示例,看起来您可以只使用大写字母(26 个字形),或者在紧要关头基本拉丁语(90 个奇怪的字形,这对于英语来说已经足够好了)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2015-02-24
  • 2011-11-03
  • 1970-01-01
  • 2023-03-14
  • 2013-06-02
  • 1970-01-01
相关资源
最近更新 更多