Canvas畫(huà)板---手機(jī)上也可以用的畫(huà)板

學(xué)習(xí)制作畫(huà)板之前诸衔,我們先來(lái)了解一下canvas標(biāo)簽
一.canvas標(biāo)簽
1.canvas標(biāo)簽與img標(biāo)簽相似,但是canvas標(biāo)簽是一個(gè)閉合標(biāo)簽下隧,并且沒(méi)有src alt屬性收毫。
2.canvas標(biāo)簽有兩個(gè)屬性攻走,width,height此再。我們?cè)陧?yè)面上用canvas繪制一個(gè)畫(huà)布時(shí)昔搂,應(yīng)用width,height屬性設(shè)置大小输拇,如果用css設(shè)置摘符,繪制圖像時(shí)可能會(huì)出現(xiàn)扭曲。
3.渲染上下文 context
canvas起初是空白的策吠。為了展示逛裤,首先腳本需要找到渲染上下文,然后在它的上面繪制猴抹。
getContext()方法可以獲取到上下文context.

二.制作畫(huà)板
畫(huà)板功能:可以繪制不同顏色和粗細(xì)的線條带族,畫(huà)板上有橡皮擦功能,一鍵清除功能蟀给,下載功能蝙砌。

1.首先我們需要繪制一個(gè)自適應(yīng)屏幕寬度的畫(huà)布。

 function wResize() {
        var pageWidth = document.documentElement.clientWidth
        var pageHeight = document.documentElement.clientHeight

        canvas.width = pageWidth
        canvas.height = pageHeight
    }

2.當(dāng)用戶在畫(huà)板上繪畫(huà)時(shí)有三種狀態(tài)跋理,鼠標(biāo)點(diǎn)擊態(tài)择克,鼠標(biāo)移動(dòng)態(tài),鼠標(biāo)離開(kāi)態(tài)前普。
我們可以用mousedown,mousemove ,mouseup來(lái)監(jiān)聽(tīng)三種狀態(tài)肚邢。

當(dāng)用戶點(diǎn)擊鼠標(biāo)時(shí):

  canvas.onmousedown = function (a) {
                var x = a.clientX;
                var y = a.clientY;
                using = true;//設(shè)置變量,標(biāo)志開(kāi)始使用畫(huà)布
                if (eraserEnabled) {//如果標(biāo)志使用橡皮擦拭卿,則清除畫(huà)布內(nèi)容
                    context.clearRect(x, y, 20, 20);
                }
                else {否則記錄當(dāng)前鼠標(biāo)坐標(biāo)
                    lastPoint = {x: x, y: y}
                }
            }

當(dāng)用戶鼠標(biāo)移動(dòng)時(shí):

  canvas.onmousemove = function (a) {
                var x = a.clientX;
                var y = a.clientY;
                if (!using) {return}//判斷是否使用畫(huà)板
                if (eraserEnabled) {//如果標(biāo)志使用橡皮擦骡湖,則清除畫(huà)布內(nèi)容
                    context.clearRect(x, y, 20, 20);
                }
                else{//如果沒(méi)有使用橡皮擦
                    var newPoint = {"x": x, "y": y};//記錄鼠標(biāo)移動(dòng)到的新坐標(biāo)
                    drawLine(lastPoint.x, lastPoint.y, newPoint.x, newPoint.y) //繪制線條
                    lastPoint = newPoint;//將當(dāng)前坐標(biāo)作為下次移動(dòng)的首坐標(biāo)
                }
            }

當(dāng)鼠標(biāo)離開(kāi)時(shí):

  canvas.onmouseup = function (a) {
                using = false;//設(shè)置變量,標(biāo)志不使用畫(huà)板
            }

3.繪制直線

function drawLine(x1, y1, x2, y2) {
    context.beginPath();//開(kāi)始移動(dòng)筆觸记劈,路徑開(kāi)始
    context.moveTo(x1, y1);//其實(shí)坐標(biāo)
    context.lineWidth = lineWidth ;//默認(rèn)線條粗細(xì)
    context.lineTo(x2, y2);//結(jié)束坐標(biāo)
    context.stroke();
    context.closePath();//結(jié)束筆觸勺鸦,路徑結(jié)束
}

stroke():通過(guò)線條來(lái)繪制圖形輪廓。
fill():通過(guò)填充路徑的內(nèi)容區(qū)域生成實(shí)心的圖形

4.畫(huà)筆功能

pen.onclick = function(){
    eraserEnabled = false;//設(shè)置變量目木,標(biāo)志不使用橡皮擦
    pen.classList.add('active');//設(shè)置畫(huà)板上畫(huà)筆按鈕的樣式變化
    eraser.classList.remove('active');//設(shè)置畫(huà)板上橡皮擦按鈕的樣式變化

}

5.橡皮擦功能

eraser.onclick = function(){
    eraserEnabled = true;//標(biāo)志使用橡皮擦
    eraser.classList.add('active');//設(shè)置畫(huà)板上橡皮擦按鈕的樣式變化
    pen.classList.remove('active');//設(shè)置畫(huà)板上畫(huà)筆按鈕的樣式變化
}

6.一鍵清除功能

clear.onclick = function(){
    context.clearRect(0,0,canvas.width,canvas.height);
}

這里使用了clearRect(x, y, width, height)方法换途,清除指定矩形區(qū)域,讓清除部分完全透明刽射。x,y坐標(biāo)為其實(shí)坐標(biāo)军拟,width, height為清除矩形區(qū)域的大小。

7.一鍵下載功能

download.onclick = function(){
    var url = canvas.toDataURL('image/png');
    var a = document.createElement('a');
    document.body.appendChild(a);
    a.href = url;
    a.download = 'context';
    a.click();
}

canvas.toDataURL('image/png');該方法返回一個(gè)png格式的圖片展示的url誓禁,當(dāng)用戶點(diǎn)擊畫(huà)板上的下載按鈕懈息,在html中插入一個(gè)a標(biāo)簽,a.download指向畫(huà)布的上下文,download 屬性規(guī)定被下載的超鏈接目標(biāo)摹恰。

三.手機(jī)適配的畫(huà)板
1.添加meta標(biāo)簽:因?yàn)闉g覽器初始會(huì)將頁(yè)面現(xiàn)在手機(jī)端顯示時(shí)進(jìn)行縮放辫继,因此我們可以在meta標(biāo)簽中設(shè)置meta viewport屬性怒见,告訴瀏覽器不將頁(yè)面進(jìn)行縮放,頁(yè)面寬度=用戶設(shè)備屏幕寬度

  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">

2.移動(dòng)端監(jiān)聽(tīng)鼠標(biāo)事件的方法與pc端不同
當(dāng)鼠標(biāo)點(diǎn)擊時(shí)用ontouchstart方法監(jiān)聽(tīng):

canvas.ontouchstart = function(a){

            var x = a.touches[0].clientX;
            var y =a.touches[0].clientY;
            using = true;
            if (eraserEnabled) {
                context.clearRect(x, y, 20, 20);
            }
            else {
                lastPoint = {x: x, y: y}
            }
        }

當(dāng)鼠標(biāo)移動(dòng)是用ontouchmove方法監(jiān)聽(tīng):

 canvas.ontouchmove = function(a){

            var x = a.touches[0].clientX;
            var y = a.touches[0].clientY;
            if (!using) {return}
            if (eraserEnabled) {
                context.clearRect(x, y, 20, 20);
            }
            else{

                var newPoint = {"x": x, "y": y};
                drawLine(lastPoint.x, lastPoint.y, newPoint.x, newPoint.y)
                lastPoint = newPoint;

            }
        }

當(dāng)鼠標(biāo)離開(kāi)時(shí)用ontouchend方法監(jiān)聽(tīng):

 canvas.ontouchhend = function(a){

            using = false;
        }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姑宽,一起剝皮案震驚了整個(gè)濱河市遣耍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炮车,老刑警劉巖舵变,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘦穆,居然都是意外死亡纪隙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)扛或,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绵咱,“玉大人,你說(shuō)我怎么就攤上這事告喊◆镏簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵黔姜,是天一觀的道長(zhǎng)拢切。 經(jīng)常有香客問(wèn)我,道長(zhǎng)秆吵,這世上最難降的妖魔是什么淮椰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮纳寂,結(jié)果婚禮上主穗,老公的妹妹穿的比我還像新娘。我一直安慰自己毙芜,他們只是感情好忽媒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著腋粥,像睡著了一般晦雨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隘冲,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天闹瞧,我揣著相機(jī)與錄音,去河邊找鬼展辞。 笑死奥邮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洽腺,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脚粟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蘸朋?” 一聲冷哼從身側(cè)響起珊楼,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎度液,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體画舌,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堕担,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了曲聂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霹购。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖朋腋,靈堂內(nèi)的尸體忽然破棺而出齐疙,到底是詐尸還是另有隱情,我是刑警寧澤旭咽,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布贞奋,位于F島的核電站,受9級(jí)特大地震影響穷绵,放射性物質(zhì)發(fā)生泄漏轿塔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一仲墨、第九天 我趴在偏房一處隱蔽的房頂上張望勾缭。 院中可真熱鬧,春花似錦目养、人聲如沸俩由。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)幻梯。三九已至,卻和暖如春匈勋,著一層夾襖步出監(jiān)牢的瞬間礼旅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工洽洁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痘系,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓饿自,卻偏偏與公主長(zhǎng)得像汰翠,于是被迫代替她去往敵國(guó)和親龄坪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容