前言
在前篇RxJS 學習之旅 ~ 環境設定設定好之後,就可以開始來練習使用 RxJS 常常會舉到的例子,透過 Mouse 在 Canvas 上畫圖。
如果直接寫程式的話,大約會設定一個 isMouseDown 的變數,然後在 mousedown event 中設定它為 true, 而在 mouseup event 中,設定它為 false,而在 mousemove event 中,如果 isMouseDown 為 true ,就把線畫到那上面去。
如果透過 RxJS 要如何做呢?
實作
首先,修改 index.html ,加入 canvas 做為我們的畫布 ,如下
1 |
|
然後我們就可以透過 RxJS 來觀察 mouse 的 event ,然後將線畫出來。
mouse down (移動點) -> mouse move (畫線) -> mouse up (停止畫線)
因為畫線只需要 x, y ,所以我們將 MouseEvent 轉成 x, y 比較方便。
1 | import { fromEvent, merge } from 'rxjs'; |
結果如下,
除了 mouse 外,我們還有 touch event ,所以 touch 也是一樣可以做這樣子的處理哦!
1 | const touchEventToCoordinate = (touchEvent: any) => { |
在上面的程式中,我們將原本 MouseEvent 及 TouchEvent 的內容,透過 map 轉換成了 x, y。
所以我們可以透過 merge 將 mouseDowns 與 touchStarts , mouseMoves 與 touchMoves , mouseUps, touchEnds, touchCancels 組合,然後在這些組合中去畫線,如下,
1 | const starts = merge(mouseDowns, touchStarts); |
註: 因為 touch 事件在筆電上有可以不會被觸發,所以有可能在 touch 畫完後,mouse 一移動會一直畫線,是因為 touched 事件被沒觸發到。
註: 補上 Alejandra 推薦學習 Html 的網站 Learn HTML Free in [2022] – Basic HTML Codes for Beginners
參考資料
Handling complex mouse and touch events with RxJS
touch events may not fire at all on laptop
Learn HTML Free in [2022] – Basic HTML Codes for Beginners