canvas放射狀漸層詳解

來源:互聯網
上載者:User

標籤:

建立放射狀漸層步驟如下:

1,建立放射狀漸層對象 createRadialGradient(x0,y0,r0,x1,y1,r1),其中x0,y0,r0分別為起始圓的位置座標和半徑,x1,y1,r1為終止圓的座標和半徑。

2,設定漸層顏色 addColorStop(position,color),position為從0.0~1.0之間的值,表示漸層的相對位置;color是一個有效css顏色值。

3,設定畫筆顏色為該放射狀漸層對象。

4,畫圖。

 例:
    var c = document.getElementById(‘mycanvas‘).getContext(‘2d‘);
var radial = c.createRadialGradient(100,100,20,120,120,50); radial.addColorStop(0,‘#EE84AA‘); radial.addColorStop(0.9,‘#FF0188‘); // 顏色值 #FF0188 == rgba(255,1,136,1) radial.addColorStop(1,‘rgba(255,1,136,0)‘); c.fillStyle = radial; c.fillRect(0,0,500,500);

  如下,這個立體的球形。

 

 這個簡單的步驟中需要設定至少3個位置座標和半徑,各種座標和半徑組合會出現奇怪的形狀,什麼時候會出現奇怪的形狀,怎麼設定會出現我們想要的圓形呢?看下面實驗。  求解1:建立對象時,兩個圓的關係。 在以上基礎上,如果把建立對象代碼改為: radial = c.createRadialGradient(80,80,20,120,120,50);  //左邊或 radial = c.createRadialGradient(100,100,20,130,130,50);  // 右邊,和圓形差的太遠了,倒是可以做箭頭效果。。。  這個形狀怎麼來的? 這時讓我想起一張twitter logo的圖片,大概是這樣。所以,輔助線走起來~  代碼恢複至正常球形效果,並添加輔助線後,代碼如下:
  var c = document.getElementById(‘mycanvas‘).getContext(‘2d‘);    var radial = c.createRadialGradient(100,100,20,120,120,50);    radial.addColorStop(0,‘#EE84AA‘);    radial.addColorStop(0.9,‘#FF0188‘);    radial.addColorStop(1,‘rgba(255,1,136,0)‘);    c.fillStyle = radial;    c.fillRect(0,0,500,500);    //以下是添加的輔助線    c.arc(100,100,20,0,2*Math.PI);    c.moveTo(170,120);    c.arc(120,120,50,0,2*Math.PI);    c.stroke();

 : 

從可以看到起始圓完全在結束圓的包裹內。改變起始圓和其對應輔助線的位置,代碼如下: 
 var radial = c.createRadialGradient(80,80,20,120,120,50);    radial.addColorStop(0,‘#EE84AA‘);    radial.addColorStop(0.9,‘#FF0188‘);    radial.addColorStop(1,‘rgba(255,1,136,0)‘);    c.fillStyle = radial;    c.fillRect(0,0,500,500);    //以下是添加的輔助線    c.arc(80,80,20,0,2*Math.PI);    c.moveTo(170,120);    c.arc(120,120,50,0,2*Math.PI);    c.stroke();

 :

 

在正常圓球基礎上,改變結束圓和其對應輔助線位置
var radial = c.createRadialGradient(100,100,20,130,130,50);    radial.addColorStop(0,‘#EE84AA‘);    radial.addColorStop(0.9,‘#FF0188‘);    radial.addColorStop(1,‘rgba(255,1,136,0)‘);    c.fillStyle = radial;    c.fillRect(0,0,500,500);    //以下是添加的輔助線    c.arc(100,100,20,0,2*Math.PI);    c.moveTo(180,130);    c.arc(130,130,50,0,2*Math.PI);    c.stroke();

 :

 

現在再來看那些形狀就沒有那麼奇怪了吧。為了使效果更加明顯,在舉個栗子:
var radial = c.createRadialGradient(70,70,20,130,130,50);    radial.addColorStop(0,‘#EE84AA‘);    radial.addColorStop(0.9,‘#FF0188‘);    radial.addColorStop(1,‘rgba(255,1,136,0)‘);    c.fillStyle = radial;    c.fillRect(0,0,500,500);    //以下是添加的輔助線    c.arc(70,70,20,0,2*Math.PI);    c.moveTo(180,130);    c.arc(130,130,50,0,2*Math.PI);    c.stroke();

 ,so cute~

 

還有起始圓半徑大於結束圓半徑的情況,不再一一舉例。根據上面效果可知,如果起始圓不在結束圓內,被渲染部分為兩個圓外切線和結束圓圍成的錐形。若要成為圓形,需保證起始圓在結束圓內部。 另外,根據html規範知:1, r0或r1為負數,會報錯。2,若x0=x1, y0=y1, r0=r1,會跳過改步驟,不進行繪製。  求解二:漸層關係與繪製的圖形的關係  以上的問題被避免了,但是繪圖出現了這些形狀:前兩個問題比較明顯,是被截斷的。如果告訴你第三個也是被截斷的,你會不會相信~第三個的確是被截斷的,被圓形截斷的!為什麼會被截斷,就要說一下繪製圖形是的注意事項了~

解第一題過程中為了避免這個問題的幹擾,設定了大大的著色地區c.fillRect(0,0,500,500); 

在正常圓球的基礎上,使繪製地區減小c.fillRect(0,0,500,150),便出現第一種情況。使寬度和高度均小於圓球地區c.fillRect(0,0,300,150),便出現第二種情況。若繪製形狀為圓形,當圓球在繪製範圍內,則顯示為正常球形,類似於題一中正常情況。若圓球只有部分只繪製範圍內,便會出現3的情況,如下代碼:
var radial = c.createRadialGradient(100,100,20,120,120,50);    radial.addColorStop(0,‘#EE84AA‘);    radial.addColorStop(0.9,‘#FF0188‘);    radial.addColorStop(1,‘rgba(255,1,136,0)‘);    c.fillStyle = radial;    c.arc(80,100,60,0,2*Math.PI);    c.fill();     //以下是添加的輔助線    c.moveTo(170,120);    c.arc(120,120,50,0,2*Math.PI);    c.stroke();

 輔助線:

上面較大的圓為繪製地區,下面小點的是放射狀漸層圓。著色地區是兩個圓相交的部分。

 

綜上述,使用canvasGradient畫一個正常的圓球效果,應遵循以下幾點: 1. createRadialGradient()方法中,起始圓半徑小於結束圓半徑。 2.起始圓完全在終止圓的範圍內 3.終止圓在繪製地區內

 

相關參考地址:

https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/createRadialGradienthttps://html.spec.whatwg.org/multipage/scripting.html#dom-context-2d-createradialgradient

 

 

canvas放射狀漸層詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.