canvas-簡(jiǎn)版畫板

我們這一節(jié)結(jié)合之前的API可以來個(gè)簡(jiǎn)單的實(shí)踐

栗子:結(jié)合鼠標(biāo)交互效果實(shí)現(xiàn)畫板的功能掌腰,有寫的功能以及橡皮擦的功能(撤銷把曼、前進(jìn)就先不考慮了)

write.gif

首先來個(gè)布局:
需要調(diào)節(jié)線的粗細(xì)以及橡皮擦的大小绍些,我們需要H5的范圍表單元素

HTML

<body>
    <label>線的粗細(xì):
        <input id="line" type="range" step="1" min="1" max="20" value="4">
    </label>
    <label>橡皮檫的大芯椴佟:
        <input id="rub" type="range" step="1" min="1" max="20" value="1">
    </label>
    <script src="./index.js"></script>
</body>

JS
1遗锣、獲取表單元素: 線帆阳, 橡皮大小

var lineRange = document.getElementById('line');
var rubRange = document.getElementById('rub');

2橱夭、創(chuàng)建Canvas并添加至body中

var canvas = document.createElement('canvas');
canvas.width = 500;
canvas.height = 500;
canvas.style.cssText = 'border: 1px solid #ccc';

document.body.appendChild(canvas);

3氨距、線的尺寸、橡皮尺寸:綁定事件

// 線的尺寸
lineRange.addEventListener('input', changeLineWidth);
// 橡皮尺寸
rubRange.addEventListener('input', changeRubSize);

// 橡皮檫的尺寸
function changeRubSize() {
    rubSize = this.value;
}

// 線的粗細(xì)
function changeLineWidth() {
    ctx.lineWidth = this.value;
}

4棘劣、 canvas中的事件

var ctx = canvas.getContext('2d');
// 線的粗細(xì)
ctx.lineWidth = 4;
// 橡皮檫的尺寸
var rubSize = 1;
// 是否可用寫擦功能
var isPress = false;
// 按鈕類型
var btnType;

4.1 canvas則需要監(jiān)聽鼠標(biāo)按下的事件俏让,說明用戶下筆

canvas.addEventListener('mousedown', penDown);

// 左鍵為 寫 0
// 中鍵為 橡皮檫  1
// 下筆事件
function penDown(event) {
    isPress = true;
    btnType = event.button;
    // 第一種 坐標(biāo)方式
    var curX = event.offsetX;
    var curY = event.offsetY;

// 寫
// 當(dāng)鼠標(biāo)按鍵類型為0的時(shí)候,說明用戶開始下筆
if (btnType === 0) {
    // 開啟一個(gè)新的路徑
        ctx.beginPath();

        // 并且將鼠標(biāo)按下的坐標(biāo)作為繪制路徑的起始點(diǎn)
        ctx.moveTo(curX, curY);
    }
}

4.2 當(dāng)用戶鼠標(biāo)按下,并且此時(shí)監(jiān)聽鼠標(biāo)移動(dòng)的事件首昔,說明用戶此時(shí)正在畫布上移動(dòng)寡喝,也就說明用戶正在繪制路徑

canvas.addEventListener('mousemove', penMove);

// 筆移動(dòng)事件
function penMove(event) {
    
    if (isPress) {
        // 第一種 坐標(biāo)方式
        // var curX = event.offsetX;
        // var curY = event.offsetY;

        // 第二種 坐標(biāo)方式
        var curX1 = event.clientX - canvas.getBoundingClientRect().x;
        var curY1 = event.clientY - canvas.getBoundingClientRect().y;

        // 確認(rèn)過用戶是否按下鼠標(biāo),當(dāng)按下時(shí)isPress則會(huì)為true勒奇,
        // 當(dāng)btnType則為0预鬓,說明可繪制路徑
        // 當(dāng)btnType則為1,說明使用橡皮擦
        switch (btnType) {
            case 0:
                write(curX1, curY1);
                break;
            case 1:
                rub(curX1, curY1);
                break;
        }
    }
}

// 寫
function write(x, y) {
    ctx.lineTo(x, y);
    ctx.stroke();
}

// 擦:擦的功能則是clearRect赊颠, 需要注意的是格二,橡皮擦的中心需要是光標(biāo)的中心
function rub(x, y) {
    var size = 10 * rubSize;
    // 橡皮檫的中心點(diǎn)
    ctx.clearRect(x - (size / 2), y - (size / 2), size, size);
}

4.3 當(dāng)鼠標(biāo)按鍵抬起的時(shí)候,說明用戶此時(shí)將筆離開畫布了
鼠標(biāo)抬起事件觸發(fā)竣蹦,則isPress需要重置為false顶猜,閉合路徑

canvas.addEventListener('mouseup', penUp);

// 提筆
function penUp() {
    isPress = false;
    ctx.closePath();
}

canvas-圓的繪制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市痘括,隨后出現(xiàn)的幾起案子长窄,更是在濱河造成了極大的恐慌,老刑警劉巖远寸,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抄淑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡驰后,警方通過查閱死者的電腦和手機(jī)肆资,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灶芝,“玉大人郑原,你說我怎么就攤上這事∫固椋” “怎么了犯犁?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)女器。 經(jīng)常有香客問我酸役,道長(zhǎng),這世上最難降的妖魔是什么驾胆? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任涣澡,我火速辦了婚禮,結(jié)果婚禮上丧诺,老公的妹妹穿的比我還像新娘入桂。我一直安慰自己,他們只是感情好驳阎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布抗愁。 她就那樣靜靜地躺著馁蒂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜘腌。 梳的紋絲不亂的頭發(fā)上沫屡,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音逢捺,去河邊找鬼谁鳍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛劫瞳,可吹牛的內(nèi)容都是我干的倘潜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼志于,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼涮因!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伺绽,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤养泡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后奈应,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澜掩,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年杖挣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肩榕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惩妇,死狀恐怖株汉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歌殃,我是刑警寧澤乔妈,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站氓皱,受9級(jí)特大地震影響路召,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜波材,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一股淡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧各聘,春花似錦揣非、人聲如沸抡医。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至大脉,卻和暖如春搞监,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镰矿。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工琐驴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秤标。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓绝淡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親苍姜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牢酵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • ??JavaScript 與 HTML 之間的交互是通過事件實(shí)現(xiàn)的馍乙。 ??事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,490評(píng)論 1 11
  • 本節(jié)介紹各種常見的瀏覽器事件垫释。 鼠標(biāo)事件 鼠標(biāo)事件指與鼠標(biāo)相關(guān)的事件丝格,主要有以下一些。 click 事件棵譬,dblc...
    許先生__閱讀 2,432評(píng)論 0 4
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程显蝌,因...
    小菜c閱讀 6,401評(píng)論 0 17
  • 在前面一篇文章中琅束,我們分析了Android應(yīng)用程序窗口的繪圖表面的創(chuàng)建過程。Android應(yīng)用程序窗口的繪圖表面在...
    一個(gè)不掉頭發(fā)的開發(fā)閱讀 4,568評(píng)論 0 14
  • 一算谈、實(shí)現(xiàn)思路 (非觸屏設(shè)備) 監(jiān)聽鼠標(biāo)事件①按下鼠標(biāo):onmousedown涩禀;滑動(dòng)鼠標(biāo):onmousemove;松...
    darkTi閱讀 1,206評(píng)論 0 1