【问题标题】:AS3 TextField not applying <b> tagAS3 TextField 未应用 <b> 标签
【发布时间】:2011-08-13 17:21:12
【问题描述】:

我使用 AS3 动态创建、调整大小、定位和格式化文本字段。我正在从 xml 文件的内容中动态设置文本字段的内容。我正在尝试使用粗体标签并注意到它不起作用。经过一番搜索,我能想到的最好的结果是“Flash CS4 tag in with htmlText”。底线:我必须嵌入一个加粗字体。

例如,假设我想使用 Tahoma。在我的 .fla 文件(使用 Flash CS4)中,我嵌入了 Tahoma 并将其导出以用于 actionscript。这让我可以在我的文本字段中使用 Tahoma 作为字体。如果我尝试使用 b 标签 (textfield.htmlText="not bold, &lt;b&gt;bold&lt;/b&gt;";),粗体文本不会被加粗。基于上述问题,我现在也嵌入了粗体版的 Tahoma。

如何将 Tahoma 的粗体版本与 Tahoma 的常规版本链接,以便在使用粗体标签时在我的文本字段中获得 bold 文本?

【问题讨论】:

    标签: actionscript-3 flash-cs3


    【解决方案1】:

    要设置某些部分的文本加粗,您必须使用令人讨厌的方式:TextFormats。

    像这样;

    var t:TextField = new TextField();
    t.text = "this is bold";
    
    var f:TextFormat = new TextFormat();
    f.bold = true;
    
    t.setTextFormat(f, 0, 4); // start at character 0, end at character 4
    
    addChild(t);
    

    这将输出以下内容:this 是粗体。

    编辑 这应该会更容易:

    /**
     * Render a given portion of a String as bold
     * @param field The target TextField
     * @param needle The section of text to render bold
     */
    function bolden(field:TextField, needle:String):void
    {
        var tf:TextFormat = new TextFormat();
        tf.bold = true;
    
        var pos:uint = field.text.indexOf(needle);
        field.setTextFormat(tf, pos, pos + needle.length);
    }
    
    
    // example below
    var t:TextField = new TextField();
    t.text = "i like iced tea";
    
    bolden(t, "iced");
    
    addChild(t);
    

    编辑 怎么了。

    /**
     * Apply <b> tags
     * @param field The target TextField
     */
    function bolden(field:TextField):void
    {
        var tf:TextFormat = new TextFormat();
        tf.bold = true;
    
        var pos:int = 0;
        var cls:int = 0;
    
        while(true)
        {
            pos = field.text.indexOf("<b>", pos);
            cls = field.text.indexOf("</b>", pos);
    
            if(pos == -1) break;
    
            field.setTextFormat(tf, pos+3, cls);
            pos = cls;
        }
    }
    
    
    // example below
    var t:TextField = new TextField();
    
    t.width = stage.stageWidth;
    t.htmlText = "i like <b>iced</b> tea and <b>showbags</b>";
    
    bolden(t);
    
    addChild(t);
    

    产量:我喜欢冰镇茶和展示包

    【讨论】:

    • 一个有趣的方法。我无法让它正常工作(索引越界错误和文本的错误部分加粗)。我不得不对其进行调整以使其正常工作。看我的回答
    • 不要忘记在使用 setTextFormat 方法之前需要设置文本。
    • 哦,是的。当我第一次开始使用 textformatting 时,我就知道了。
    【解决方案2】:

    基于@Marty Wallace的回答:

    我已经在代码的前面设置了我的文本格式。它会加载字体、大小等。

    我正在做的是将字体应用到我的文本字段,然后如果字符串包含粗体标记,则将 textformat 粗体属性设置为 true。将代码放在 setTextFormat 上方会使整个文本字段变为粗体。出于某种原因,将其设置在文本字段下方会使标记的文本变为粗体。

    textfield.setTextFormat(textformat);
    if(xmlText.search('<b>')){
        textformat.bold = true;
    }
    

    [编辑]

    不需要 if:

    textfield.setTextFormat(textformat);
    textformat.bold = true;
    

    [编辑]

    您还需要嵌入的加粗字体才能正常工作。我将它从我的库中删除,但无法再次使用粗体>。

    所以现在如果我想在我的 htmlText 中使用 ,我需要嵌入所有字体的加粗和斜体版本

    【讨论】:

    • @Marty 当我传入我想要加粗的文本时它会起作用。但是,当我尝试动态应用它时,我仍然会出现越界错误。我认为文本字段没有计算 html 标签的位置;即 String.indexOf 函数返回 标记的位置。使用这些作为开始/结束值会产生错误,因为我认为文本字段在应用粗体时会删除它们。我的字符串实际上缩短了 7 个字符。
    【解决方案3】:

    在 Flash 中,放置实例名称为“myTextField”的动态文本字段,并将以下代码放置在时间轴上。 (仅用于测试目的,否则不推荐使用时间线代码),

     var str:String = <![CDATA[ <font face='Arial' size='18' align='left'> This is my <b>BOLD</b>  text </font>]]>;
     myTextField.htmlText = str;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      相关资源
      最近更新 更多