canvas實現簡單的Amaziograph效果畫對稱圖

標題很難引人入勝,先放個效果圖好了

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

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

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

上次“雷達圖效果”文章很榮幸,被“某天頭條”抓數據抓去了,不開心的是demo鏈接等所有鏈接都干掉了~~~ ?blabla,連個名字都木有。

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

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

創意來源

之前看到的gif效果,為了這個文章又去找了一下。貌似是ipad的app “Amaziograph”。看起來真的很爽,很美

配上我自己畫的圖先:

手殘不會畫畫,各位見笑。(手機上瀏覽器畫的哦)

DEMO講解

1.效果分析

a.參考線坐標軸 -- 為了簡單控制參考線顯示隱藏,單獨一個canvas來搞,也不用每次重繪

b.繪畫主體 -- 繪畫效果(canvas畫線);對稱效果(canvas旋轉)

c.配置區 -- 簡單dom

簡單來看,很容易實現嘛

2.開搞

1> 坐標系統

其實就是畫幾條線,但是要均分角度。一種方法是,計算出各個點,然后從中心點發散去畫線;另一種是,一邊旋轉canvas,一邊畫圓心到統一坐標的線。由于繪畫是需用到canvas旋轉,所以這里統一使用旋轉來處理。

那么,就需要先來處理canvas旋轉

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}

當然,這個是我嘗試多次之后寫好的方法。

1、存儲ctx狀態到棧,

2、移動旋轉點(canvas坐標原點)到canvas中心,

3、旋轉指定角度,

4、執行繪制函數fn,

5、從棧里邊取回ctx的狀態(包含但不僅包含 fillStyle、strokenStyle、translate等等),這里主要處理的是translate,因為我們下次用到坐標會受影響,所以要讓canva坐標原點回到原來的位置。

其實這里translate還是比較抽象比較繞的。。。可能我比較遲緩

然后,是繪制參考線坐標

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過沖中一直畫線鏈接兩個點。對拖拽不了解的可以去了解下,直接上代碼

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 用來判斷是鼠標哪個鍵,0是左鍵

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

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

至此,應該可以畫出對稱的線條了。

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

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

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

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>設置等

這里dom比較簡單,就略過了。只說一項,下載canvas圖片到本地

最簡單的,右鍵保存圖片到本地,但是你肯定會罵我傻,誰不知道這操作啊;那么就來稍微裝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}

(寫這個博客的時候,返現自己把這個方法寫麻煩了,繞遠了。/手動尷尬,這里直接改了)

關鍵點在于a.download屬性,這個是把文件下載到本地的關鍵哦,然后要把canvas轉成base64(canvas.toDataUrl方法,不清楚的可以去去了解下,這里不再贅述)

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

最后,附上完整代碼(可能會和上邊的有點出如,還在調整)

+ View Code

**************偷偷留個名字,防抓 ?博客園-fe-bean***************

涉及姿勢點總結

1.canvas_translate

2.canvas_rotate

3.canvas_toDataUrl

4.a.download ?&& ?base64

其余的想起來再添加吧

最后,歡迎大家多提意見、交流,點贊轉載那就更棒了。

再丟一張圖

下期再見咯~~~

**************** ? 少俠留步,能看到這里的,我要給你們一個獎勵 ? ***************

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

沒有電容筆的親,肯定是大多數,我們一樣能玩啊!!!

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

1.找一只木質鉛筆

2.削出鉛筆頭

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

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

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

歡迎加入技術qq群:364595326

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容