2012-03-31 60 views

回答

0

这可能是由于Flash解释HTML的方式与大多数主要供应商浏览器解释HTML的方式不同所致。我的猜测是更细致的控制,你可以使用这个例子http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS2AEF3551-BB6C-4e20-8865-83CD7E685263.html,并建立一些可以让你加载多个类的Flash文本引擎中使用的风格。

只有想到的其他东西是使用某种正常flash组件外的html包装来显示将解释类属性如何您期望的html。

1

这将最终破裂,但是如果你只是想几个款式相结合,你可以做这样的事情,不会有使用FTE或TLF以上的建议:

巢<跨度>与另一个<跨度>内的第一种风格具有第二种风格。内部跨度的样式属性将覆盖外部跨度上的样式属性,就像CSS继承一样。

package 
{ 
    import flash.display.Sprite; 
    import flash.text.StyleSheet; 
    import flash.text.TextField; 

    public class CSSTEst extends Sprite 
    { 
     public function CSSTEst() 
     { 
      var style:StyleSheet = new StyleSheet(); 
      var redStyle:Object = {}; 
      redStyle.color = "#FF0000"; 
      style.setStyle(".darkRed", redStyle); 
      var bigStyle:Object = {}; 
      bigStyle.fontWeight = "bold"; 
      bigStyle.fontSize = 36; 
      style.setStyle(".big", bigStyle); 
      var greenStyle:Object = {}; 
      greenStyle.color = "#00FF00"; 
      style.setStyle(".green", greenStyle); 
      var tf:TextField = new TextField(); 
      tf.styleSheet = style; 
      tf.htmlText = "<span class='darkRed'><span class='big'>Red</span></span> apple, Granny's <span class='big'>big <span class='green'>green</span> apple</span>"; 
      tf.width = tf.textWidth + 10; 
      addChild(tf); 
     } 
    } 
} 
+0

您可以通过扩展TextField类和手动的htmlTextclass属性的所有引用的款式组合成一个新的样式表,然后将其传递给super.styleSheet代替原有的一个做到这一点是的,尽管它很笨拙,但我最终还是采用了这种解决方案。 – 2012-04-02 15:06:36

+0

这种方法的问题在于,您必须修改源文本 - 这与将样式表从内容与样式信息分离的想法相矛盾。如果你愿意这样做,你不妨使用旧的''标签...... – weltraumpirat 2012-04-03 15:23:09

2

样式表可以容纳带有空格的名称,因此,例如“classOne classTwo”是一个有效的标识符 - 所有你需要做的就是引用的风格结合成一种新的风格的结合名下,和你的文本会正确显示。

package 
{ 
    import flash.text.StyleSheet; 
    import flash.text.TextField; 


    public class MyWildTextField extends TextField 
    { 
     private var _combinedStyleSheet:StyleSheet = new StyleSheet(); 
     private var _styleSheet : StyleSheet; 

     override public function set htmlText(text:String) : void { 
      combineStyles(text); 
      super.styleSheet = _combinedStyleSheet; 
      super.htmlText = text; 
     } 

     private function combineStyles(text:String):void { 
      for each (var name : String in styleSheet.styleNames) 
       _combinedStyleSheet.setStyle(name, styleSheet.getStyle(name)); 

      var styles:Array = extractStyleNames(text); 
      for each(var style:String in styles) addCombinedStyle(style); 
     } 

     private function extractStyleNames(text:String):Array { 
      var xml:XML = XML(text); 
      var styles:Array = []; 
      var allNodes:XMLList = xml..*; 
      var allAttributes:XMLList = allNodes.attributes(); 
      styles = addStyleNames (allAttributes, styles); 
      styles = addStyleNames (xml.attributes(), styles); 
      return styles; 
     } 

     private function addCombinedStyle(style:String):void { 
      if(style.indexOf(" ") > -1) 
       _combinedStyleSheet.setStyle("."+style, getCombinedStyle(style)); 
     } 

     private function addStyleNames (attributes:XMLList, arr:Array) : Array { 
      for each(var node:XML in attributes) 
       if(node.name() == "class") 
        arr.push(node.valueOf().toString()); 
      return arr; 
     } 

     private function getCombinedStyle(style:String):Object { 
      var combined:Object = {}; 
      for each(var name:String in style.split(" ")) 
       combined = addStyleProperties(combined, name); 
      return combined; 
     } 

     private function addStyleProperties(combined:Object, name:String):Object { 
      var style:Object = styleSheet.getStyle("."+name); 
      for(var prop:String in style) 
       combined[prop] = style[prop]; 
      return combined; 
     } 

     override public function get styleSheet() : StyleSheet { 
      return _styleSheet; 
     } 

     override public function set styleSheet (styleSheet:StyleSheet) : void { 
      _styleSheet = styleSheet; 
     } 
    } 
} 
+0

好的技术! – 2012-04-03 18:38:23

相关问题