canvas實(shí)現(xiàn)簡(jiǎn)單的Amaziograph效果畫對(duì)稱圖

標(biāo)題很難引人入勝申眼,先放個(gè)效果圖好了

如果圖片吸引不了你娄柳,那我覺得也就沒啥看的了零蓉。

demo鏈接:https://win7killer.github.io/can_demo/demo/draw_roll_2.html

*************************************************

上次“雷達(dá)圖效果”文章很榮幸糜工,被“某天頭條”抓數(shù)據(jù)抓去了捕传,不開心的是demo鏈接等所有鏈接都干掉了~~~ ?blabla筐骇,連個(gè)名字都木有债鸡。

想看的再看下:http://www.cnblogs.com/ufex/p/6655336.html

*************************************************

創(chuàng)意來源

之前看到的gif效果,為了這個(gè)文章又去找了一下铛纬。貌似是ipad的app “Amaziograph”厌均。看起來真的很爽告唆,很美

配上我自己畫的圖先:

手殘不會(huì)畫畫棺弊,各位見笑。(手機(jī)上瀏覽器畫的哦)

DEMO講解

1.效果分析

a.參考線坐標(biāo)軸 -- 為了簡(jiǎn)單控制參考線顯示隱藏擒悬,單獨(dú)一個(gè)canvas來搞模她,也不用每次重繪

b.繪畫主體 -- 繪畫效果(canvas畫線);對(duì)稱效果(canvas旋轉(zhuǎn))

c.配置區(qū) -- 簡(jiǎn)單dom

簡(jiǎn)單來看懂牧,很容易實(shí)現(xiàn)嘛

2.開搞

1> 坐標(biāo)系統(tǒng)

其實(shí)就是畫幾條線侈净,但是要均分角度。一種方法是僧凤,計(jì)算出各個(gè)點(diǎn)畜侦,然后從中心點(diǎn)發(fā)散去畫線;另一種是躯保,一邊旋轉(zhuǎn)canvas旋膳,一邊畫圓心到統(tǒng)一坐標(biāo)的線。由于繪畫是需用到canvas旋轉(zhuǎn)途事,所以這里統(tǒng)一使用旋轉(zhuǎn)來處理验懊。

那么,就需要先來處理canvas旋轉(zhuǎn)

1functiondrawRotate(deg, fn, _ctx) {2_ctx = _ctx ||ctx3_ctx.save();4_ctx.translate(_ctx.canvas.width / 2, _ctx.canvas.height / 2);5_ctx.rotate(deg);6fn &&fn(_ctx);7_ctx.restore();8}

當(dāng)然尸变,這個(gè)是我嘗試多次之后寫好的方法鲁森。

1、存儲(chǔ)ctx狀態(tài)到棧振惰,

2、移動(dòng)旋轉(zhuǎn)點(diǎn)(canvas坐標(biāo)原點(diǎn))到canvas中心垄懂,

3骑晶、旋轉(zhuǎn)指定角度痛垛,

4、執(zhí)行繪制函數(shù)fn桶蛔,

5匙头、從棧里邊取回ctx的狀態(tài)(包含但不僅包含 fillStyle、strokenStyle仔雷、translate等等),這里主要處理的是translate蹂析,因?yàn)槲覀兿麓斡玫阶鴺?biāo)會(huì)受影響,所以要讓canva坐標(biāo)原點(diǎn)回到原來的位置碟婆。

其實(shí)這里translate還是比較抽象比較繞的电抚。。竖共◎眩可能我比較遲緩

然后,是繪制參考線坐標(biāo)

1functionbaseLine() {2ctx_role.clearRect(0, 0, ctx_role.canvas.width, ctx_role.canvas.height);3vardeg = 360 /pieace;4console.log(deg);5ctx_role.lineWidth = 1;6ctx_role.strokeStyle = 'rgba(0,0,0,.5)';7for(vari = 0, l = pieace; i < l; i++) {8drawRotate(i * deg / 180 * Math.PI,function(ctx_role) {9draw({10bx: can_role.width / 2,11by: can_role.width / 2,12ex: can_role.width / 2 +can_role.width,13ey: can_role.width / 214}, ctx_role);15}, ctx_role);16}17}

1functiondraw(option, _ctx) {2_ctx = _ctx ||ctx;3_ctx.beginPath();4_ctx.moveTo(option.bx - _ctx.canvas.width / 2, option.by - _ctx.canvas.height / 2);5_ctx.lineTo(option.ex - _ctx.canvas.width / 2, option.ey - _ctx.canvas.height / 2);6_ctx.stroke();7}

這樣公给,就繪制完成參考線借帘。

2>繪畫主體

首先處理一般的畫線。跟拖拽效果類似淌铐,在move過沖中一直畫線鏈接兩個(gè)點(diǎn)肺然。對(duì)拖拽不了解的可以去了解下,直接上代碼

1functionbindPc() {2can.onmousedown =function(e) {3if(e.button != 0) {4returnfalse;5}67varop ={};8op.ex = op.bx = e.clientX - can.parentElement.offsetLeft +window.scrollX;9op.ey = op.by = e.clientY - can.parentElement.offsetTop +window.scrollY;10drawFn(op);11document.onmousemove =function(e) {12document.body.style.cursor = 'pointer';13op.bx =op.ex;14op.by =op.ey;15op.ex = e.clientX - can.parentElement.offsetLeft +window.scrollX;16op.ey = e.clientY - can.parentElement.offsetTop +window.scrollY;17drawFn(op);18};19document.onmouseup =function() {20document.body.style.cursor = 'default';21document.onmouseup = document.onmousemove =null;22};23};24}

1functiondrawFn(op) {2vardeg = Math.floor(360 /pieace);3for(vari = 0, l = 360; i < l; i +=deg) {4drawRotate(i / 180 * Math.PI,function(ctx) {5draw(op);6});7}8}

需要注意腿准,e.button 用來判斷是鼠標(biāo)哪個(gè)鍵际起,0是左鍵

這里又用到了前邊的drawRotate 和?draw。

************************************

至此释涛,應(yīng)該可以畫出對(duì)稱的線條了加叁。

以下就是錦上添花的事情了

************************************

增加移動(dòng)端的繪制支持(慚愧,沒怎么寫過移動(dòng)端唇撬,歡迎多指教)

1functionbindWp() {2can.addEventListener('touchstart',function(e) {3op = can.op ={};4op.ex = op.bx = e.touches[0].clientX - can.parentElement.offsetLeft +window.scrollX;5op.ey = op.by = e.touches[0].clientY - can.parentElement.offsetTop +window.scrollY;6drawFn(op);7can.addEventListener('touchmove', touchMoveFn);8can.addEventListener('touchend', touchEndFn);9});1011functiontouchEndFn() {12document.body.style.cursor = 'default';13can.removeEventListener('touchmove', touchMoveFn);14can.removeEventListener('touchend', touchEndFn);15}1617functiontouchMoveFn(e) {18op =can.op;19document.body.style.cursor = 'pointer';20op.bx =op.ex;21op.by =op.ey;22op.ex = e.touches[0].clientX - can.parentElement.offsetLeft +window.scrollX;23op.ey = e.touches[0].clientY - can.parentElement.offsetTop +window.scrollY;24drawFn(op);25returnfalse;26}27}

3>設(shè)置等

這里dom比較簡(jiǎn)單它匕,就略過了。只說一項(xiàng)窖认,下載canvas圖片到本地

最簡(jiǎn)單的豫柬,右鍵保存圖片到本地,但是你肯定會(huì)罵我傻扑浸,誰(shuí)不知道這操作吧崭;那么就來稍微裝X一下吧

線上代碼

1functiondownload() {2vardata = can.toDataURL('image/png', 0.8);3var$a = document.createElement('a');4$a.download = imgName.value || 'default.png';5$a.target = '_blank';6$a.href =data;7$a.click();8}

(寫這個(gè)博客的時(shí)候喝噪,返現(xiàn)自己把這個(gè)方法寫麻煩了础嫡,繞遠(yuǎn)了。/手動(dòng)尷尬,這里直接改了)

關(guān)鍵點(diǎn)在于a.download屬性榴鼎,這個(gè)是把文件下載到本地的關(guān)鍵哦伯诬,然后要把canvas轉(zhuǎn)成base64(canvas.toDataUrl方法,不清楚的可以去去了解下巫财,這里不再贅述)

******************************************************

最后盗似,附上完整代碼(可能會(huì)和上邊的有點(diǎn)出如,還在調(diào)整)

+ View Code

**************偷偷留個(gè)名字平项,防抓 ?博客園-fe-bean***************

涉及姿勢(shì)點(diǎn)總結(jié)

1.canvas_translate

2.canvas_rotate

3.canvas_toDataUrl

4.a.download ?&& ?base64

其余的想起來再添加吧

最后赫舒,歡迎大家多提意見、交流闽瓢,點(diǎn)贊轉(zhuǎn)載那就更棒了接癌。

再丟一張圖

下期再見咯~~~

**************** ? 少俠留步,能看到這里的鸳粉,我要給你們一個(gè)獎(jiǎng)勵(lì) ? ***************

這個(gè)demo是可以在移動(dòng)端玩的扔涧,意味著有電容筆的親,可以爽啊~(個(gè)別瀏覽器腦殘會(huì)左右來回跑~~)

沒有電容筆的親届谈,肯定是大多數(shù)枯夜,我們一樣能玩啊<枭健:ⅰ!

叫你們快速做一款電容筆(當(dāng)然沒那么好用)

1.找一只木質(zhì)鉛筆

2.削出鉛筆頭

3.把鉛筆頭斜著磨平曙搬,如圖

4.用磨平這一側(cè)去電容屏上畫(開始吧)

我上邊那張圖就是拿鉛筆畫的~~~

歡迎加入技術(shù)qq群:364595326

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末摔吏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纵装,更是在濱河造成了極大的恐慌征讲,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橡娄,死亡現(xiàn)場(chǎng)離奇詭異诗箍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挽唉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門滤祖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓶籽,你說我怎么就攤上這事匠童。” “怎么了塑顺?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵汤求,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)首昔,這世上最難降的妖魔是什么寡喝? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮勒奇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巧骚。我一直安慰自己赊颠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布劈彪。 她就那樣靜靜地躺著竣蹦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沧奴。 梳的紋絲不亂的頭發(fā)上痘括,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音滔吠,去河邊找鬼纲菌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疮绷,可吹牛的內(nèi)容都是我干的翰舌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼冬骚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼椅贱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起只冻,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤庇麦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后喜德,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體山橄,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年住诸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驾胆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贱呐,死狀恐怖丧诺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奄薇,我是刑警寧澤驳阎,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響呵晚,放射性物質(zhì)發(fā)生泄漏蜘腌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一饵隙、第九天 我趴在偏房一處隱蔽的房頂上張望撮珠。 院中可真熱鬧,春花似錦金矛、人聲如沸芯急。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娶耍。三九已至,卻和暖如春饼酿,著一層夾襖步出監(jiān)牢的瞬間榕酒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工故俐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留想鹰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓购披,卻偏偏與公主長(zhǎng)得像杖挣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刚陡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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