天天看點

積少成多Flash(6) - ActionScript 3.0 繪圖之圖形和轉換

<a href="http://webabcd.blog.51cto.com/1787395/342175" target="_blank">[索引頁]</a>

<a href="http://down.51cto.com/data/100162" target="_blank">[源碼下載下傳]</a>

積少成多Flash(6) - ActionScript 3.0 繪圖之圖形和轉換

介紹

示範使用 Flash ActionScript 3.0 畫一些基本的圖形,以及對繪制的圖形或其他可視對象做一些基本的轉換

畫圖 - 通過 Shape 對象的 graphics 屬性來執行矢量繪圖指令

1、使用 lineStyle() 定義畫圖的線條樣式

2、moveTo() - 設定目前繪畫點;lineTo() - 以目前繪畫點為起點,用目前定義的線條樣式,畫一條直線到目标點;curveTo() - 指定二次貝塞爾曲線的控制點和終點,進而完成曲線的繪制;drawRect() - 繪制矩形;drawCircle() - 繪制圓形;drawEllipse() - 繪制橢圓;

3、beginFill() 和 endFill() 用于填充他們之間所繪制的圖形。如果是漸變填充則對應的方法是 beginGradientFill 和 endFill()

轉換 - 通過設定對象的 transform.matrix 屬性,對其做相應的轉換

Matrix.rotate() - 旋轉的角度

Matrix.translate() - 平移的距離

Matrix.scale() - 縮放的比例

Matrix.b - 将矩陣垂直傾斜

Matrix.c - 将矩陣水準傾斜

1、畫圖

在 UI 上放置 8 個 Button

名稱分别為:btnLine, btnCurve, btnRectangle, btnCircle, btnEllipse, btnLiner, btnRadial, btnClea

分别用于示範:畫直線,畫曲線,畫矩形,畫圓形,畫橢圓,線性漸變填充,放射性漸變填充,清除圖形

Main.as

package    

        import flash.display.MovieClip; 

        import fl.events.ComponentEvent; 

        import fl.events.SliderEvent; 

        import flash.display.Shape; 

        import flash.geom.Matrix; 

        import flash.display.GradientType; 

        import flash.display.SpreadMethod; 

        public class Main extends MovieClip 

        { 

                var originalMatrix:Matrix; 

                public function Main():void 

                { 

                        btnLine.addEventListener(ComponentEvent.BUTTON_DOWN, drawLine); 

                        btnCurve.addEventListener(ComponentEvent.BUTTON_DOWN, drawCurve); 

                        btnRectangle.addEventListener(ComponentEvent.BUTTON_DOWN, drawRectangle); 

                        btnCircle.addEventListener(ComponentEvent.BUTTON_DOWN, drawCircle); 

                        btnEllipse.addEventListener(ComponentEvent.BUTTON_DOWN, drawEllipse); 

                        btnLiner.addEventListener(ComponentEvent.BUTTON_DOWN, drawLinerGradient); 

                        btnRadial.addEventListener(ComponentEvent.BUTTON_DOWN, drawRadialGradient); 

                        btnClear.addEventListener(ComponentEvent.BUTTON_DOWN, clearGraphics); 

                } 

                // 畫直線 

                function drawLine(e:ComponentEvent):void    

                        // lineStyle() - 定義畫圖的線條樣式 

                        //         第一個參數:線條粗細,整數(0 - 255) 

                        //         第二個參數:線條的顔色值(16進制) 

                        //         第三個參數:不透明度(0 - 1) 

                        canvas.graphics.lineStyle(12, 0x000000); 

                        // moveTo() - 設定目前繪畫點。在本例中就是直線的起點 

                        canvas.graphics.moveTo(0, 0); 

                        // lineTo() - 以目前繪畫點為起點,用目前定義的線條樣式,畫一條直線到目标點 

                        canvas.graphics.lineTo(100, 100); 

                // 畫曲線(二次貝塞爾曲線) 

                function drawCurve(e:ComponentEvent):void    

                        canvas.graphics.lineStyle(1, 0x000000); 

                        canvas.graphics.moveTo(100, 0); 

                        // curveTo() - 指定二次貝塞爾曲線的控制點和終點,進而完成曲線的繪制 

                        //         前兩個參數為控制點,後兩個參數為終點,目前繪畫點為起點 

                        canvas.graphics.curveTo(100, 100, 200, 200); 

                // 畫矩形 

                function drawRectangle(e:ComponentEvent):void    

                        canvas.graphics.lineStyle(5, 0xFF0000); 

                        // drawRect() - 繪制矩形 

                        //         第一個參數:矩形左上角的 x 坐标 

                        //         第二個參數:矩形左上角的 y 坐标 

                        //         第三個參數:矩形的寬 

                        //         第四個參數:矩形的高 

                        canvas.graphics.drawRect(200, 0, 100, 50); 

                // 畫圓 

                function drawCircle(e:ComponentEvent):void    

                        // beginFill() - 單色填充這之後所繪制的圖形,直到調用endFill()為止 

                        //         兩個參數分别為填充的顔色值和不透明度 

                        canvas.graphics.beginFill(0xFF0000, 0.5); 

                        // drawCircle() - 繪制圓形 

                        //         三個參數分别為圓心的 x 坐标,圓心的 y 坐标,圓形的半徑 

                        canvas.graphics.drawCircle(300, 0, 30); 

                        // endFill() - 呈現 beginFill() 與 endFill() 之間所繪制的圖形的填充效果 

                        canvas.graphics.endFill(); 

                }         

                // 畫橢圓 

                function drawEllipse(e:ComponentEvent):void    

                        canvas.graphics.beginFill(0xFF0000); 

                        // drawEllipse() - 繪制橢圓 

                        //         前兩個參數:橢圓左側頂點的 x 坐标和 y 坐标 

                        //         後兩個參數:橢圓的寬和高 

                        canvas.graphics.drawEllipse(0, 200, 100, 50); 

                // 線性漸變填充 

                function drawLinerGradient(e:ComponentEvent):void    

                        // 聲明一個仿射矩陣 Matrix 

                        var gradientBoxMatrix:Matrix = new Matrix(); 

                        // createGradientBox() - Matrix 的一個專門為漸變填充提供的方法 

                        //         三個參數分别為漸變框的寬,漸變框的高,漸變框的旋轉弧度 

                        gradientBoxMatrix.createGradientBox(50, 20, 0); 

                        // beginGradientFill() - 做漸變填充 

                        //         第一個參數:漸變模式。GradientType.LINEAR為線性漸變;GradientType.RADIAL為放射性漸變 

                        //         第二個參數:漸變色的顔色值數組 

                        //         第三個參數:漸變色的不透明度數組 

                        //         第四個參數:漸變色的分布比例數組(0 - 255)。0為漸變框的最左側,255為漸變框的最右側 

                        //         第五個參數:用 Matrix.createGradientBox() 生成的漸變框 

                        //         第六個參數:伸展方式    

                        //                 SpreadMethod.PAD - 用線性漸變線末端的顔色值填充剩餘空間 

                        //                 SpreadMethod.REFLECT - 相鄰填充區域,以 相反方向 重複漸變,直至填充滿整個剩餘空間 

                        //                 SpreadMethod.REPEAT - 相鄰填充區域,以 相同方向 重複漸變,直至填充滿整個剩餘空間 

                        canvas.graphics.beginGradientFill(GradientType.LINEAR, [0xFF0000, 0x0000FF], [1, 1], [0, 255], gradientBoxMatrix, SpreadMethod.REPEAT); 

                        canvas.graphics.drawRect(100, 200, 100, 20); 

                // 放射性漸變填充 

                function drawRadialGradient(e:ComponentEvent):void 

                {                 

                        // GradientType.RADIAL - 放射性漸變 

                        canvas.graphics.beginGradientFill(GradientType.RADIAL, [0xFF0000, 0x0000FF], [1, 1], [0, 255], gradientBoxMatrix, SpreadMethod.REFLECT); 

                        canvas.graphics.drawCircle(200, 200, 30); 

                // 清除圖形 

                function clearGraphics(e:ComponentEvent):void 

                {         

                        // clear() - 清除 Graphics 上的圖形,并重置線條樣式和填充等設定 

                        canvas.graphics.clear(); 

        } 

}

2、轉換

在 UI 上放置 3 個 Silder

分别名為:sliderScaleX, sliderScaleY, sliderRotate

分别用于示範 X 軸方向上的縮放,Y 軸方向上的縮放,旋轉

再放置 2 個 Button

分别名為:btnMatrix, btnClearMatrix

分别用于示範仿射矩陣在圖形轉換上的應用,還原為對象的初始仿射矩陣轉換

                        sliderScaleX.addEventListener(SliderEvent.THUMB_DRAG, scaleXHandler); 

                        sliderScaleY.addEventListener(SliderEvent.THUMB_DRAG, scaleYHandler); 

                        sliderRotate.addEventListener(SliderEvent.THUMB_DRAG, rotateHandler); 

                        btnMatrix.addEventListener(ComponentEvent.BUTTON_DOWN, matrixHandler); 

                        btnClearMatrix.addEventListener(ComponentEvent.BUTTON_DOWN, clearMatrixHandler); 

                        // 儲存 canvas 的初始仿射矩陣轉換 

                        originalMatrix = canvas.transform.matrix; 

                // 在 x 軸方向上做縮放 

                function scaleXHandler(e:SliderEvent):void 

                        // scaleX - x軸方向上的縮放比例 

                        canvas.scaleX = e.value; 

                // 在 y 軸方向上做縮放 

                function scaleYHandler(e:SliderEvent):void 

                        // scaleY - y軸方向上的縮放比例 

                        canvas.scaleY = e.value; 

                // 旋轉 

                function rotateHandler(e:SliderEvent):void 

                        // rotation - 旋轉的度數 

                        canvas.rotation = e.value; 

                // 仿射矩陣在圖形轉換上的應用 

                function matrixHandler(e:ComponentEvent):void 

                        var matrix:Matrix = new Matrix(); 

                        // rotate() - 旋轉的角度 

                        matrix.rotate(10); 

                        // translate() - 平移的距離 

                        matrix.translate(200, 200); 

                        // scale() - 縮放的比例 

                        matrix.scale(1.2, 1.2); 

                        var skewMatrix:Matrix = new Matrix(); 

                        // 調整 b 屬性将矩陣垂直傾斜 

                        // 調整 c 屬性将矩陣水準傾斜 

                        skewMatrix.b = Math.tan(0.78);    

                        // concat() - 組合兩個仿射矩陣 

                        matrix.concat(skewMatrix); 

                        // 在對象上應用仿射矩陣轉換 

                        canvas.transform.matrix = matrix; 

                // 還原為初始的仿射矩陣轉換 

                function clearMatrixHandler(e:ComponentEvent):void 

                        // 設定 canvas 的仿射矩陣轉換為初始的仿射矩陣 

                        canvas.transform.matrix = originalMatrix; 

OK

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/342194,如需轉載請自行聯系原作者

繼續閱讀