2011-10-18 25 views
2

私はactionscript 3でサイトを構築しています。背景が見えるようにテキストが切り取られた四角でグリッドを作成しました。今はXML経由で何百ものPNGをロードすることでこれをやっていますが、これによりサイトのサイズが大幅に増加します。actionscriptのテキストで塗りつぶしを作成する3

通常、テキストを切り離し、塗りつぶしから取り除くことができるように、テキストを分割して塗りつぶしすることで、通常のようにテキストを切り取ることが可能かどうか疑問に思っていました。私は今、スペースと時間を節約するために、これをアクションスクリプトで行う方法を探しています。 私は主題を研究しており、私はこれをactionscriptでどのように行うかについての情報は見つかりませんでした。要するに

私はテキストはここで、ActionScriptの3

答えて

1

enter image description hereを切り出して塗りつぶしを作成するには、マスクとして、ダイナミックテキストフィールドを使用していることを実行する方法です。トリックは、テキストフィールドのアルファチャンネルを反転させることです。 このクラスは透明なビットマップデータを作成します。 次に、テキストフィールドを作成します。 次に、テキストフィールドを描画するビットマップデータを作成します。 テキストを描画し、テキストのアルファチャンネルを反転させて、以前に表示されたものを切り捨てます。 テキストbitmapdataのアルファチャンネルをカラーbitmapdatに適用します。その結果、色からテキストが切り取られます。最後に 。ビットマップを追加して私たちの作業を示します。 (コロンがテキストを切り取っていることがわかります) これをマシン上で実行すると、アニメーションエイリアシングのないデフォルトのフォントが使用されるため、ジャギーが発生します。しかし、あなたは簡単に独自のフォントで独自のテキストフィールドを作成し、その代わりに描画することができます。その後、滑らかに見えます。

package 
{ 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.BitmapDataChannel; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.TextEvent; 
    import flash.geom.ColorTransform; 
    import flash.geom.Point; 
    import flash.geom.Rectangle; 
    import flash.text.TextField; 

    /** 
    * ... 
    * @author Zachary Foley 
    */ 
    public class Main extends Sprite 
    { 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      // entry point 
      // Make a red square bitmapdata that allows transparency. 
      var color:BitmapData = new BitmapData(400, 400, true, 0xFF990000); 
      var word:TextField = new TextField; 
      word.text = "HELLO MASK"; 
      var textMask:BitmapData = new BitmapData(word.width, word.height, true, 0x00000000); 
      textMask.draw(word); 
      textMask = invert(textMask); 

      var colorHolder:Bitmap = new Bitmap(color); 
      addChild(colorHolder); 
      color.copyChannel(textMask, textMask.rect, new Point(0, 0), BitmapDataChannel.RED, BitmapDataChannel.ALPHA); 
     } 

     private function invert(oldBmp:BitmapData):BitmapData { 
      var source:BitmapData = oldBmp; 
      var destination_bitmap:BitmapData = source.clone(); 
      var rectan:Rectangle = new Rectangle(0, 0, source.width, source.height); 

      // Replace all transparent pixels with a solid color 
      destination_bitmap.threshold(source, rectan, new Point(), "==", 0x00000000,0xFFFF0000); 
      // Replace all the pixels greater than 0xf1f1f1 by transparent pixels 
      destination_bitmap.threshold(source, rectan, new Point(), "==", 0xff656565,0x0000FF00);   
      return destination_bitmap; 
     } 

    } 

} 
関連する問題