快速上手RaphaelJS-Instant RaphaelJS Starter翻譯(一)


   (目前發現一些文章被盜用的情況,我們將在每篇文章前面添加原文地址,本文源地址: http://www.cnblogs.com/idealer3d/p/Instant_RaphaelJS_Starter.html
      Raphael Javascript是一個 Javascript的矢量庫。
      它可以處理SVG、VML格式的矢量圖,它使用SVG W3C推薦標准和VML作為創建圖形的基礎,你可以用Javascript 操作Dom 很容易的創建出復雜的柱狀圖、走勢圖、曲線圖等各種圖表,可以畫圖,可以畫出任意復雜度的圖像,以及圖表或圖像裁剪和旋轉等復雜操作。
      目前網上已經可以找到對面RaphaelJS包代碼的詳解教材。在此將嘗試對尚無中文版的RaphaelJS書進行翻譯。第一部書定為《raphaeljs_starter》,本書網上可以搜到並下載。一共60多頁的內容並不太多,適合對RaphaelJS的初步學習和認知。翻譯的過程中將穿插一些自己學習過程中的新的和測試代碼。另翻譯中,比較口語化,沒有按照原文逐詞翻譯,只是將貼近的漢語意思說了出來。
      本書前9頁內容分別為封面、本書簡介、作者簡介、鳴謝、版權聲明、致讀者等內容,將不再進行翻譯。
      第十頁開始是目錄頁,我們從 目錄開始翻譯:
                內容表格
 
快速上手RaphaelJS------- --------------------------------------------------------1
       RaphaelJS是什么?----------------------------------------------------------- 3
       雙頭和三字母---------------------------------------------------------------- 3  
       兩個難題的結合以及RaphaleJS的誕生 ------------------------------------------3
            JavaScript – 求同存異 ----------------------------------------------------3
       瀏覽器支持 ------------------------------------------------------------------3
       什么是RaphaelJS,什么不是RaphaelJS?--------------------------------------- 4  
            一點關於矢量光柵圖形的內容 -----------------------------------------------4  
            RaphaelJS作為一個矢量圖形包--------------------------------------------- 5
       RapahaelJS所使用的x,y坐標系-------------------------------------------------5
安裝------------------------------------------------------------------------------ 6
      第一步 – 我需要什么? ----------------------------------------------------------6  
      第二步 – 下載RaphaelJS------------------------------------------------------- 6  
      第三步 – 把它加載到HTML里面 --------------------------------------------------7
      這就是了! ---------------------------------------------------------------------7
快速入門 – 創建你第一個圖形------------------------------------------------------- 8  
       第一步 – 建立一個用來繪制圖形的畫布------------------------------------------ 8  
            在你的瀏覽器視口中建立一個畫布-------------------------------------------- 8
            在一個元素里面建立一個對象 (推薦) ------------------------------------------9
       第二步 – 繪制圓--------------------------------------------------------------- 9
             attr() 方法 --------------------------------------------------------------10
你需要知道的重要特征--------------------------------------------------------------12
      創建一個Raphael元素 ---------------------------------------------------------12
           基本圖形 ------------------------------------------------------------------12
           復雜圖形------------------------------------------------------------------ 15
      在一個編輯器里面提取和使用paths(path:路徑)-------------------------------- 17
           矢量圖形編輯器 ------------------------------------------------------------17
           創建文本-------------------------------------------------------------------20
      操作元素的樣式---------------------------------------------------------------- 22
      轉換一個元素------------------------------------------------------------------ 22
            操作一個圖形-------------------------------------------------------------- 22
      賦予一個圖形以生命(其實就是動畫) --------------------------------------------26
      轉換動畫---------------------------------------------------------------------- 28
      給Raphael元素添加事件-------------------------------------------------------- 29
            鼠標點擊事件--------------------------------------------------------------29
            鼠標懸停時間------------------------------------------------------------- 30
      你肯定想要知道和使用的方法--------------------------------------------------- 31
            對元素操作的方法--------------------------------------------------------- 31
            對畫布操作的方法 ---------------------------------------------------------39
            Set方法------------------------------------------------------------------ 42
你該知道的人和地兒---------------------------------------------------------------- 45
      官方網站----------------------------------------------------------------------45  
      文章和教材------------------------------------------------------------------- 45  
      社區------------------------------------------------------------------------- 45
      博客------------------------------------------------------------------------- 46
      推特------------------------------------------------------------------------- 46
總結------------------------------------------------------------------------------47 
 
      題外話:其實從這個目錄我們就能看出,RaphaelJS這個js包並不特別大,但是想要用得好並不簡單。其實書中介紹的內容不過是:1、RaphaelJS能做什么(繪制矢量圖);2、怎么做(建立一個畫布,調用方法創建圖形);3、圖形怎么處理(賦予屬性和轉換圖形);4、綁定和處理事件:(點擊和懸停)。
      前面我學了一段時間這個js包,直接調用方法畫一些圖形其實是非常簡單的。難度在於如何建造復雜圖形以及變換方法的活用以及事件的處理。Ok,我們繼續。
 
本書第十二頁是最目錄的補充說明:
 
      快速上手RaphaelJS
     
歡迎閱讀《 快速上手RaphaelJS》。
本書是為需要上手RaphaelJS的你提供你需要的所有RaphaelJS的內容。你將會學習到RaphaelJS的基礎知識、編寫你的腳本並且去發掘RaphaelJS的技巧和騙局。本文包含下面這些部分:
RaphaelJS是什么?----弄清楚RaphaelJS到底是什么,你可以用它來做什么,為什么它so great(。。差點想翻譯成:它為何如此之叼)
安裝----學校如何去下載和安裝RaphaelJS然后最快的搭建起來你的環境。
快速入門----這個部分將會帶你領略RaphaelJS的核心任務:繪制圖形。一步一步地去完成你使用RaphaelJS的大部分基礎共奏:建立你自己的圖形。
你需要知道的重要特征----這里你將學習到RaphaelJS最重要的特征。
你該知道的人和地兒---你應該知道的其它資源。
 
下面開始正文翻譯。
 
什么是RaphaelJS?

RaphaelJS是一個矢量繪圖包,用來在瀏覽器中繪制圖形。
在這部分,我們將了解到RaphaelJS是什么、它與其它同類的繪圖包有什么不同,它如何從html5 Canvas中脫穎而出。
 
雙頭和三個字母
差不多十年前,我們有一個技術大突破稱為: 可縮放矢量圖形(SVG)。 SVG可縮放矢量圖形(Scalable Vector Graphics)是基於 可擴展標記語言(XML),用於描述二維矢量圖形的一種圖形格式。SVG是W3C("World Wide Web ConSortium" 即 " 國際互聯網標准組織")在2000年8月制定的一種新的二維矢量圖形格式,也是規范中的網絡矢量圖形標准。SVG嚴格遵從XML語法,並用文本格式的描述性語言來描述圖像內容,因此是一種和圖像分辨率無關的矢量圖形格式。盡管SVG基於VML發展而來,但是SVG和VML不能在一個瀏覽器中同時協調工作。SVG可以運行在所有除了版本低於IE9的的IE之外的瀏覽器。
一個兩頭和三個字母的頭疼事兒。
(IE就是喜歡雞立鶴群!)
兩個問題的結合以及RaphaelJS的誕生
SVG曾是一個美妙的新生兒,但是沒人想要承受分娩之痛--使用SVG和VML進行跨瀏覽器的代碼編寫太難以致大部分開發者直接用圖片去了。因為我們有兩種不同的技術,但是他們用不同的語法去完成同樣的事情,但是他們卻不能共存在一個瀏覽器中。讓它們在一個和諧相處有點困難。
Javascript--求同存異
Javascript最終解決了他倆不能和諧相處的問題,那就是RaphaelJS。
瀏覽器支持
絕大部分瀏覽器都支持SVG,ie的所有5.0以上版本都支持VML。而RaphaelJS可以讓他們倆在所有瀏覽器上都運行。RaphaelJS---兩棲動物!
什么事RaphaelJS,什么不是?
我們已經知道RaphaelJS是SVG和VML的結合並可以獲得瀏覽器支持。它是萬能而且可靠的。但是我們還得知道那些不是RaphaelJS處理的東西。
一些關於矢量圖和位圖的知識
 其實就是講圖形有兩種類型:位圖和矢量圖,位圖放大失真而矢量圖放大不失真。因為位圖是建立像素基礎上的,所以放大失真。而矢量圖是通過特殊數學算法來實現放大不失真。
 
  位圖矢量圖
如圖所示,瓶子上面的字體放大仍舊很清晰的就是矢量圖,模糊的就是位圖。
 
RaphaelJS,一個矢量圖包
RaphaelJS作為一個矢量圖包,它所以繪制的內容是一個真正的DOM節點。因此它可以被動態的訪問、操作、變化大小並敲打錘煉成為其它你想要的圖形。更有意思的是它們可以綁定比如點擊、懸停、移出等鼠標操作。RaphaelJS的功能簡直令人難以置信。
 
RaphaelJS的x,y坐標系
RaphaelJS使用x,y坐標系去繪制圖形。屏幕最左上角為0,0位置然后水平為x軸,垂直為y軸。
所以,如果代碼里出現(15,20)意思就是這個點位於x軸15個點(水平),y軸20個點的位置(垂直)。
RaphaelJS作為一個矢量圖包,繪制時根據瀏覽器選擇使用SVG或者VML。因為繪制出來是一個實際存在的DOM節點,所以可以賦予點擊、懸停等操作。這些都是很有趣的地方。
【RaphaelJS和HTML5 Canvas是2個截然不同的東西。盡管它們所做的事情很相似:繪畫。但是它們的實現方式並不相同。RaphaelJS以矢量繪制為基礎,而HTML5 Canvas則是以光柵為基礎 】
 
安裝
 安裝和搭建RaphaelJS非常簡單。你只要下載最新的RaphaelJS的版本然后它引用到html中就行了。
簡單的3步,你就可以安裝好RaphaelJS並且開始使用了。
第一步:我需要什么?
在你安裝RaphaelJS之前,你需要檢查你是不是准備好了如下的東西:
    1、瀏覽器;
    2、文本編輯器
第二步-下載RaphaelJS
最簡單的獲取方式就是從https://raw.github.com/DmitryBaranovskiy/raphael/master/raphael-min.js 去下載。RaphaelJS和別的包不同,它沒有其它任何依賴,就是這一個文件。這個鏈接讓你下一個文本,所以你只要把它復制粘貼到一個文本文件改名叫做raphael.js或者其它名字就行了。

raphael下載

 raphael下載
第三步-添加RaphaelJS到html中
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Raphael Test</title>
    </head>
    <body>
        <div id="my-canvas" style="width:140px;padding:0px;margin:0px;">
        </div>
        <!--some html doms-->
        <!--some scripts-->
        <script type="text/javascript" src="../js/lib/raphael.js">
        </script>
    </body>
</html>

代碼和原書細節可能不同,是我自己測試用例,總體按照原書來寫的。

【注意這里,此書里面講解了為什么要把引用raphael.js 放置在html元素的最下方。因為瀏覽器執行html的代碼是順序執行的。你如果把引用放在前面,瀏覽器會先加載它,導致中間有段時間頁面會停滯,這里推薦你先加載dom元素再導入這個js包。】

到此位置,我們的下載和搭建就已經完成了。

在瀏覽器視口創建畫布

創建raphael物體(對象),依賴於raphael的方法和function,如下所示:

var raphaelObj = Raphael(x,y,width,height); 

Raphael function中4個參數分別是x坐標、y坐標、寬度、高度。

因為這個是在瀏覽器視口里面來創建的,所以畫布的位置是絕對定位。因此,它會在所有html元素下面重疊。

比如:

// 在瀏覽器視口中創建畫布
var paper = Raphael(20, 30, 650, 400);

 

這里的Raphael對象被初始化並且分配一個變量稱為paper。這個變量被賦予RaphaelJS的所有權利。它從此以后成為Raphael畫布對象。

在元素中創建Raphael對象(推薦)


要在一個元素中初始化一個Raphael對象,我們必須把這個元素的ID或者這個元素本身加入到坐標系(x,y)中。

我們舉個例子:


//元素本身作為參數

//This line creates a Raphael paper inside 'my-canvas', which is 650pxin width and 400px in height

var elm= document.getElementById("my-canvas");

var paper = Raphael(elm, 650, 400);

//or

// 直接傳遞元素的ID作為參數

//This line also creates a Raphael paper inside 'my-canvas', which is 650px in width and 400px in height

var paper = Raphael("my-canvas", 650, 400);

 

這樣我們就可以啟動引擎開始跑了!

 第二步--繪制圓形


Raphael可以繪制的基本圖形有圓形、矩形和橢圓等。

圓形可以通過調用circle()來發來進行。我們使用剛才的paper對象來進行調用。

語法如下:

var cir = paper.circle(x,y,r);

// x and y are the positioning co-ordinates, and "r" is the radius of the circle

//Here the circle is assigned to a variable called cir.

//Example

var cir = paper.circle(35,25,20);

// This will create a circle of 20 pixels in radius at 35,25 (X & Y axis).

 

circle()方法一共3個參數,分別是x,y坐標和半徑。我們在剛才的代碼中添加上面的操作。

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Raphael Test</title>
    </head>
    <body>
        <div id="my-canvas" style="width:140px;padding:0px;margin:0px;">
        </div>
        <!--some html doms-->
        <!--some scripts-->
        <script type="text/javascript" src="../js/lib/raphael.js">
        </script>
        <script type="text/javascript">
            var paper = Raphael("my-canvas", 650, 400);
            var cir = paper.circle(30, 30, 10);
        </script>
    </body>
</html>

 circle

 效果如上圖所示,由於沒有賦予paper和cir其它屬性,所以沒有顏色之類的屬性,我們看起來不直觀。下面將介紹attr()方法。

attr() 方法


attr()方法,將我們要添加或者修改的屬性作為參數,屬性其實就是鍵值對。如果你熟悉jQuery的話,你就明白attr()的語法與jquery的完全一致。進一步講,就是JSON格式數據。做過js的童鞋們,或多或少應該接觸過JSON。沒接觸過的,建議去翻閱一下資料。比XML更快的數據傳遞方式,以后肯定會大放異彩。

語法如下:

element.attr({
"Property1":value1,
"Property2":value2

})

//加入如下屬性的鍵值對

var coloredCircle = paper.circle(35,25,20).attr({
"fill":"#17A9C6",
"stroke":"#2A6570",
"stroke-width":2

});

剛才這個例子添加到我們的Script里面就行了,這里不再截圖和添加代碼了。效果是:在坐標(35,25)位置出現一個半徑為20的顏色為深綠的圓(本人色弱,顏色認錯大家莫怪)。

當然,還有其它非常多的屬性可以添加。有興趣大家可以自己去查閱一下資料,這里暫不提及。本書最后部分會有涉及。

下面我們要講的部分是本書的重點,也是學習Raphael.js的重點。上面講了那么多其實不過是三兩行代碼就可以搞定的事情,前提是你正確的下載了包並引用了正確的路徑。接下來我們要講的是創建、操作、轉換、動畫、事件響應等內容,是Raphael的核心部分,也是工作涉及到的重要部分。

你需要了解的重要特性

 創建一個Raphael的元素非常容易。為了更加方便,有些已經定義好的方法供生成一些基本的幾何圖形。

基本圖形

RaphaelJS有3個基本圖形,分別是 圓、橢圓和矩形。前面已經講過圓形,這里我就不再贅述圓形了。

矩形

我們可以使用rect()方法來創建一個矩形。這個方法一共有4個必須參數和一個可選參數。5個參數按順序分別是x坐標、y坐標、矩形寬度、矩形高度、圓角半徑。

圓角半徑默認為0,為可選參數。

語法如下:

paper.rect(X,Y,Width,Height,border-radius(optional));

var rect = paper.rect(35,25,170,100).attr({
"fill":"#17A9C6", //filling with background color
"stroke":"#2A6570", // border color of the rectangle
"stroke-width":2 // the width of the border

});

 圓角矩形:

var rect = paper.rect(35,25,170,100,20).attr({ 
"fill":"#17A9C6", //filling with background color 
"stroke":"#2A6570", // border color of the rectangle 
"stroke-width":2 // the width of the border

});

代碼如下:
 
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Raphael Test</title>
    </head>
    <body>
        <div id="my-canvas" style="width:140px;padding:0px;margin:0px;">
        </div>
        <!--some html doms-->
        <!--some scripts-->
        <script type="text/javascript" src="../js/lib/raphael.js">
        </script>
        <script type="text/javascript">
            var paper = Raphael("my-canvas", 650, 400);
            var cir = paper.circle(30, 30, 10);
            var coloredCircle = paper.circle(55, 45, 20).attr({
                "fill": "#17A9C6",
                "stroke": "#2A6570",
                "stroke-width": 2
            });
            var rect = paper.rect(65, 65, 120, 80).attr({
                "fill": "#17A9C6", //filling with background color 
                "stroke": "#2A6570", // border color of the rectangle 
                "stroke-width": 2 // the width of the border
            });
             var rect1 = paper.rect(190, 65, 120, 80,20).attr({
                "fill": "#17A9C6", //filling with background color 
                "stroke": "#2A6570", // border color of the rectangle 
                "stroke-width": 2 // the width of the border
            });
        </script>
    </body>
</html>

 效果如下:

 rect

  橢圓
橢圓的方法是ellipse(),有4個必要參數。分別是x坐標、y坐標、水平半徑、垂直半徑。水平半徑和垂直半徑其實就是橢圓的寬和高除以2。
語法如下:

paper.ellipse(X,Y,rX,rY);

var ellipse = paper.ellipse(195,125,170,100).attr({ 

"fill":"#17A9C6", // background color of the ellipse 

"stroke":"#2A6570", // ellipse's border color
"stroke-width":2 // border width

});

 由於和上面矩形的代碼幾乎一致,除了參數意義。這里不再重復代碼和截圖。
 
復雜圖形
 
    建立上面那種基本圖形可以說非常簡單。但是復雜圖形,比如五角星、八角形等怎么辦?它們根本不是圓或者矩形或者橢圓。
    這是Raphael的另外一個奇異之處。
    復雜圖形的創建將使用path()方法。它只有一個參數,我們稱它為pathString。看上去就是一串字母和數字的組合。其實它非常易於閱讀和理解。
    在這之前,我們先想象一下自己畫復雜圖形的場景。其實你拿一支筆在紙上畫畫的話,就好像你從一個起點開始,不斷的連線到構成你的圖畫。其實這里的機制就是如此,通過線的連接來構成復雜圖形,連線可以使直線也可以是曲線。

Paper.path([pathString])

pathString SVG格式的路徑字符串。

路徑字符串由一個或多個命令組成。每個命令以一個字母開始,隨后是逗號(“,”)分隔的參數。例如:"M10,20L30,40"

我們看到兩個命令:“M”與參數(10, 20)和“L”與參數(30, 40)大寫字母的意思是命令是絕對的,小寫是相對的。

這里是可用命令的簡表,詳細內容請參照:SVG路徑字符串格式 。

命令 名稱 參數
M 移動到(moveTo) (x y)+
Z 閉合路徑(closepath) (none)
L 直線(lineTo) (x y)+
H 水平直線 x+
V 垂直直線 y+
C 曲線(curveto) (x1 y1 x2 y2 x y)+
S 平滑曲線 (x2 y2 x y)+
Q 二次貝賽爾曲線 (x1 y1 x y)+
T 平滑二次貝塞爾曲線 (x y)+
A 橢圓弧 (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
R Catmull-Rom 曲線* x1 y1 (x y)+

* “Catmull-Rom 曲線”不是標准SVG命令,在2.0版時被加入。 注:有種特殊情況,路徑只包含三個命令:“M10,10R…z”。在這種情況下,路徑將平滑連接到它的起點。

語法如下:

paper.path("pathString");

var tri = paper.path("M0,0L26,0L13,18L0,0").attr({

"fill":"#17A9C6", // filling the background color
"stroke":"#2A6570", // the color of the border
"stroke-width":2 // the size of the border

});

      具體例子的介紹稍后,這里先說明一下,上面的命令都是命令+參數這樣子的。但是命令有大小寫的區別,其效果也不同。大寫表示絕對,小寫為相對。比如(M20,20)表示從(0,0)位置來計算的,而(m20,20)則是相對畫筆的位置(dom位置)來計算。
     在這里你可能會感覺很頭大,因為這么多命令,還有幾個挺難理解的曲線。再加上復雜圖形怎么可能直接就寫一串字符出來。其實不必擔心,因為復雜圖形你可以使用工具來進行繪制。在矢量圖制作工具中制作完成然后導出svg格式就行了。推薦使用一個叫做inkscape的矢量圖制作工具。
    (2014-01-07接上)
      首先說下,昨天文章里面有個內容是js的引用在body底下位置,這里其實如果你使用jquery或者dojo等框架,可以等document加載完成加入那些js就行了。比如 $(document).ready( function (){})這樣子的。
      下面舉一些例子來講解下path里面的那些命令。
       
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Raphael Test</title>
    </head>
    <body>
        <div id="my-canvas" style="width:140px;padding:0px;margin:0px;">
        </div>
        <!--some html doms-->
        <!--some scripts-->
        <script type="text/javascript" src="../js/lib/raphael.js">
        </script>
        <script type="text/javascript">
            var paper = Raphael("my-canvas", 700, 600);
            //1、直線使用path命令L
            paper.path("M20,20L100,20z").attr({
                "fill": "#5DDEF4",
                "stroke": "#2A6570",
                "stroke-width": 2
            });
            //2、三角形使用Path命令L
            paper.path("M130,30 L200,30 L160,90 z").attr({
                "fill": "#5DDEF4",
                "stroke": "#2A6570",
                "stroke-width": 2
            });
            //3、T形使用Path命令H,V
            paper.path("M 40,40 H 90 V 60 H 70 V 110 H 60 V 60 H 40 z").attr({
                "fill": "#5DDEF4",
                "stroke": "#2A6570",
                "stroke-width": 2
            });
            //4、2次貝塞爾曲線形,使用path命令Q
            paper.path("M240,40L300,40L300,100");
            paper.path("M240,40Q300,40 300,100").attr('stroke', 'red');
            //5、2次貝塞爾曲線形,使用path命令Q和T(第一個是正常繪制,第二個光滑連接)  
            paper.path('M10,250 L90,130 L160,160 L250,190 L250,70');
            paper.path('M10,250 Q90,130 160,160 T250,70').attr('stroke', 'red');
            
            //6、繪制3次貝賽爾曲線,使用命令C,平滑畫線使用命令S
            paper.path('M320,120 L350,180 L450,260 L480,140');
            paper.path('M320,120 C350,180 450,260 480,140').attr('stroke', 'red');
            paper.path('M320,120 S450,260 480,140').attr('stroke', 'yellow');
        </script>
    </body>
</html>

代碼里面刪除了上面文字里面的基本圖形的繪制代碼。為了節省空間,這里就使用這些繪制path的代碼。上面代碼中一共6個小模塊,使用了path命令中最后2個之外的其它所有命令。最后兩個待會兒解釋。先解釋上面幾個。代碼運行效果圖如下:

 path

    這里說明下,原書這里是去inkscape里面里面用inkscape自帶的一些工具畫了一些星星之類的圖形,這里我們是直接寫的path命令串,可以更加容易地加深對於path的理解。我們看運行效果圖,一共有6個圖形。我們上面的代碼塊也有6小塊,分別對應瀏覽器上面的6個圖形。
    繪制直線,准確的說是繪制連線,我們代碼內容是這樣的:
paper.path("M20,20L100,20z")

這里,pathString為M20,20L100,20z,我們查看上面的path命令表。發現執行情況是這樣的:我們的筆移動到坐標(20,20)的位置,連一條線到(100,20),閉合path。也就是上面6個圖形中的最左上角的那個線段。
接下來是那個三角形:
paper.path("M130,30 L200,30 L160,90 z")

三角形這個命令和上面線段是一致的,只是多連了一次,構成了一個三角形。這里我們是可以明白,只要你不斷的用L命令去連接,其實可以構成任意復雜的圖形。下面我們繼續講解第三個代碼塊:
 paper.path("M 40,40 H 90 V 60 H 70 V 110 H 60 V 60 H 40 z")

這里我們用到了H和V命令,這倆命令我們通過查看path命令表可知道它們分別是橫着和豎着連線。所以剛才上面那行代碼的執行情況是:我們的筆移動到(40,40),水平線連接到x坐標90,垂直線連接到60,水平線······如此反復,需要注意H和V后面跟的不是線的長度而是坐標,最后我們閉合path得到一個T的圖形。這個其實使用上面那個L命令也可以做到,但是水平和垂直命令名對於這種0角度或者90度的線處理起來更加容易。
第四塊代碼如下:
paper.path("M240,40L300,40L300,100");
paper.path("M240,40Q300,40 300,100");

這里我們第一行代碼是畫兩條線段,上面講解到了,只不過這里沒有z結尾來閉合path。第二行代碼使用的坐標與第一個完全一致,只不過兩個L命令換成了Q,我們查看命令表,Q表示二次貝塞爾曲線,效果大家可以看靠上位置的那個曲線和曲線附着的的線段。Q命令的后的坐標含義可以通過上面線段的坐標來得知。
第五個代碼塊如下:
paper.path('M10,250 L90,130 L160,160 L250,190 L250,70');
paper.path('M10,250 Q90,130 160,160 T250,70');

這里的效果圖是上面圖形中最大那個圖形。其實如果理解了第四個圖形,這個很好理解。唯一的不同就是這里使用了T命令,這個T和接下來的S命令很相似,就是分別對應Q和S的平滑曲線畫法,生活他們中間的那個坐標,而直接使用后一(兩)個坐標即可。

第六個代碼塊如下:
paper.path('M320,120 L350,180 L450,260 L480,140');
paper.path('M320,120 C350,180 450,260 480,140').attr('stroke', 'red');
paper.path('M320,120 S450,260 480,140').attr('stroke', 'yellow');

看到最后一幅圖,我們看的到一條紅色曲線和一條黃色,兩個圖形的區別就是命令中缺省第一個坐標的區別。上面第5個圖形也可以做成類似第六幅圖的曲線對比圖,大家可以稍微修改一下代碼就能搞定了。當然這里其實曲線的每個附着的線段是不是必要存在,為了加深理解,我們將它畫了出來。

關於橢圓曲線,這里我直接引用http://lblovesnow-163-com.iteye.com/blog/1485388這個博客博主的測試用例吧。這個博主寫的這些測試用例非常到位,我就借花獻佛了。代碼如下:
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Raphael Test</title>
    </head>
    <body>
        <div id="my-canvas" style="width:140px;padding:0px;margin:0px;">
        </div>
        <!--some html doms-->
        <!--some scripts-->
        <script type="text/javascript" src="../js/lib/raphael.js">
        </script>
        <script type="text/javascript">
            var paper = Raphael("my-canvas", 700, 600);
            //繪制左上的橢圓  
            paper.ellipse(130,40,60,30);  
            paper.ellipse(70,70,60,30);  
            paper.path('M70,40 A60,30 0 0,0 130,70').attr('stroke','yellow');  
            paper.text(40,30,'start(70,40)')  
                .attr({  
                    'font-size':11,  
                    'fill':'blue'  
                });  
            paper.text(160,80,'end(130,70)')  
                .attr({  
                    'font-size':11,  
                    'fill':'blue'  
                });  
  
            paper.text(70,120,'large-arc-flag=0\nsweep-flag=0')  
                .attr({  
                    'font-size': 11,  
                    'fill': 'green',  
                    'text-anchor': 'start'  
                });  
              
            //繪制右上的橢圓  
            paper.ellipse(330,40,60,30);  
            paper.ellipse(270,70,60,30);  
            paper.path('M270,40 A60,30 0 0,1 330,70').attr('stroke','yellow');  
            paper.text(240,30,'start(270,40)')  
                .attr({  
                    'font-size':11,  
                    'fill':'blue'  
                });  
            paper.text(360,80,'end(330,70)')  
                .attr({  
                    'font-size':11,  
                    'fill':'blue'  
                });  
            paper.text(270,120,'large-arc-flag=0\nsweep-flag=1')  
                .attr({  
                    'font-size': 11,  
                    'fill': 'green',  
                    'text-anchor': 'start'  
                });  
  
            //繪制左下的橢圓  
            paper.ellipse(130,240,60,30);  
            paper.ellipse(70,270,60,30);  
            paper.path('M70,240 A60,30 0 1,0 130,270').attr('stroke','yellow');  
            paper.text(40,230,'start(70,240)')  
                .attr({  
                    'font-size':11,  
                    'fill':'blue'  
                });  
            paper.text(160,280,'end(130,270)')  
                .attr({  
                    'font-size':11,  
                    'fill':'blue'  
                });  
            paper.text(70,320,'large-arc-flag=1\nsweep-flag=0')  
                .attr({  
                    'font-size': 11,  
                    'fill': 'green',  
                    'text-anchor': 'start'  
                });  
              
            //繪制右下的橢圓  
            paper.ellipse(330,240,60,30);  
            paper.ellipse(270,270,60,30);  
            paper.path('M270,240 A60,30 0 1,1 330,270').attr('stroke','yellow');  
            paper.text(240,230,'start(270,240)')  
                .attr({  
                    'font-size':11,  
                    'fill':'blue'  
                });  
            paper.text(360,280,'end(330,270)')  
                .attr({  
                    'font-size':11,  
                    'fill':'blue'  
                });  
            paper.text(270,320,'large-arc-flag=1\nsweep-flag=1')  
                .attr({  
                    'font-size': 11,  
                    'fill': 'green',  
                    'text-anchor': 'start'  
                });  
        </script>
    </body>
</html>

其中有個paper.text方法正好我們解析來要講解的內容,這里也算提前預覽一下。

A(a)elliptical arc(rx ry x-axis-rotation large-arc-flag sweep-flag x y) 

參數含義:

rx:橫軸的長度;

ry:縱軸的長度;

x-axis-rotation:橢圓的橫軸與x軸的角度;

large-arc-flag:區分弧度的大小(0表示小角度弧度,1表示大角度弧度);

sweep-flag:繪制弧度圍繞橢圓中心的方向(0表示逆時針方向,1表示順時針方向);

x y:橢圓曲線終點坐標;

效果圖如下:

 橢圓曲線

 圖畫上面有個A命令的參數含義,其實加上這位博主的參數含義的解釋還是很好理解的。注意圖中的黃色曲線,每個下面有2個參數的解釋,忽略4組圖形的開始和結束坐標,其實他們的區別就是在larget-arc-flag和sweep-flag的參數設置不同。

large-arc-flag:區分弧度的大小(0表示小角度弧度,1表示大角度弧度);

sweep-flag:繪制弧度圍繞橢圓中心的方向(0表示逆時針方向,1表示順時針方向);

是不是一目了然?larget-arc-flag就是畫小弧還是大弧的區別、sweep-flag是逆時針還是順時針。

 “Catmull-Rom 曲線”不是SVG標准命令,這里不再贅述,有興趣的可以自己去研究測試一下。

    接下來我們講解的方法是text方法。上例中出現了paper.text(),是用來顯示文字內容的方法。語法其實很簡單,就是x,y坐標和文字內容。

paper.text(X,Y,"Raphael JS Text");

var text = paper.text(40,55,"Raphael Text").attr({

"fill":"#17A9C6", // font-color

"font-size":75, // font size in pixels

"text-anchor":"start",

"font-family":"century gothic" // font family of the text

});

//text-anchor屬性表明文字與坐標的關系,是從這個坐標開始、為中心還是為結尾。屬性值可以設置 "start", "middle" or "end" 默認"middle"。

      到此位置,我們已經講解了創建畫布、創建基本圖形、創建復雜圖形、text文本內容等方法。到現在位置其實我們都是在做靜態圖畫的編輯,我們如果想要操作和添加事件,需要學習接下來的知識。接下來的內容將在下一篇博文中講述。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM