開發Canvas 繪畫應用(一):搭好框架 中咱們已經把基本框架及基礎功能實現了,如今要實現本應用的重點:繪畫功能。html
首先分析一下,咱們要實現繪畫,須要具有的理論知識以下:html5
(1)獲取觸摸點的座標git
相似於獲取鼠標在屏幕上的位置,咱們如今須要獲取手指在繪圖板上的位置,這就須要用到觸摸事件的跟蹤觸摸的屬性:github
touches
:表示當前跟蹤的觸摸操做的 Touch 對象的數組。targetTouches
:特定於事件目標的 Touch 對象的數組。changedTouches
:表示自上次觸摸以來發生了什麼改變的 Touch 對象的數組。能夠將有幾個 Touch 對象當作有幾個手指,每一個手指的觸摸點對應一系列屬性。canvas
注意:與
changedTouches
不一樣,touches
和targetTouches
在touchend
觸發時均沒有 Touch 數組,length
爲0,即觸摸點數爲0。能夠在瀏覽器上打印輸出進行對比。segmentfault
其中,每一個 Touch 對象包含下列屬性:數組
(2)Canvas 繪製路徑的方法瀏覽器
beginPath()
:繪製路徑前必須調用,表示要開始繪製新路徑。lineTo(x,y)
:從上一點開始繪製一條直線。moveTo(x,y)
:從繪圖遊標開始移動到(x,y),不畫線。closePath()
:建立路徑以後,繪製一條鏈接到起點的線條。fill()
:對路徑進行填充。stroke()
:對路徑進行描邊。clip()
:在路徑上建立一個剪切區域。OK,理論知識已經具有了,接下去就要開始搬磚了。app
① 初始化數據框架
initData() { this.lastX = 0; this.lastY = 0; this.isPaint = false; return this; }
② 實現繪畫函數
/** * 繪畫函數 * @param {[type]} x 觸摸點x座標 * @param {[type]} y 觸摸點y座標 * @return {[type]} 將當前座標賦給上一個點座標 */ draw(x, y) { if (this.isPaint) { this.ctx.beginPath(); // 開始繪製路徑,必須調用 this.ctx.moveTo(this.lastX, this.lastY); // 將繪圖遊標移動到到上一點 this.ctx.lineTo(x, y); // 從上一點開始繪製一條到(x,y)的直線 this.ctx.stroke(); // 描邊路徑 } // 上面必須判斷 this.isPaint // 當 'touchstart' 時,先移動到觸摸點 this.lastX = x; this.lastY = y; }
③ 完善事件處理函數(★重點)
// 觸摸事件處理函數 touchF(e) { e.preventDefault(); // 阻止瀏覽器默認行爲 const touches = e.changedTouches; // 獲取 Touch 對象list const point = touches[0]; // 獲取第一個 Touch 對象 // 獲取元素寬、高及距窗口上下左右距離 const rect = this.cva.getBoundingClientRect(); // 至關於const rect = $('.painter').offset(); // 至關於const rect = { left: this.cva.offsetLeft, top: this.cva.offsetTop } switch (e.type) { case 'touchstart': // 獲取觸摸點的x,y座標,傳入draw函數 this.draw(point.clientX - rect.left, point.clientY - rect.top); this.isPaint = true; break; case 'touchmove': this.draw(point.clientX - rect.left, point.clientY - rect.top); break; case 'touchend': this.isPaint = false; break; default: this.isPaint = false; break; } }
這裏須要獲取 canvas 在視口中距離左邊及頂部的距離,有3種方式:
(1) this.cva.getBoundingClientRect()
:返回一個對象,包含元素的寬、高及距窗口上下左右距離;
console.log(this.cva.getBoundingClientRect());
(2) 採用 jQuery 方法 $('.painter').offset()
:一樣返回一個對象,但只包含left值和top值;
console.log($('.painter').offset());
(3) 採用js原生方法獲取座標
console.log(this.cva.offsetWidth); // 800 console.log(this.cva.offsetHeight); // 600 console.log(this.cva.offsetLeft); // 90 console.log(this.cva.offsetTop); // 137
注意:原生 js 只有上述4個方法,沒有 offsetRight 和 offsetBottom。
大功告成!至此,已經能夠在咱們的畫布上進行相似於鉛筆的繪畫了~~固然,這是繪圖板最最基本的功能,接下去要實現更多的功能,還會用到更多的 Canvas API,須要進行迭代開發啦,有木有很興奮,嘿嘿;-)
要知下回如何,請繼續閱讀 開發Canvas繪畫應用(三)-對照繪畫