[英]Canvas Freehand drawing Undo and Redo functionality in Reactjs
[英]Undo/ redo functionality in html canvas
我在html canvas
上工作。 我實現了以下功能:
1) Simple Draw
2) Erasor
3) Shapes Draw
4) Shapes Resize
5) Shapes Move
6) Color Select
現在,我想添加undo/redo
功能。
考慮到實現的上述功能,我正在考慮在每次事件執行時保存整個canvas
實例。 例如,在執行shape resize
,我將整個畫布實例推入數組。
當用戶單擊undo
,我簡單地從數組中pop
最后一個元素,然后重新繪制canvas
。
但是,我認為每次保存整個canvas
實例都會占用大量內存,而且也不是非常理想的性能。 同樣,使用這種方法,我將不得不限制允許的最大undo/redo
次數。 如果繼續采用這種方法,我應該保留的undo/redo
的理想數量是多少。 另外,考慮到上述功能,是否有更好的方法。
使用command
設計模式,然后從命令歷史記錄中重新繪制畫布。 您將能夠節省大量步驟(幾百個甚至幾千個)。
簡而言之,您可以將操作包裝在添加到列表中的命令中,然后執行,而不是直接在畫布上繪制。 當用戶想要撤消操作時,可以從列表中刪除最后一個操作,然后重播它。 您還可以保持列表完整,並更新index marker
以允許重做。
在您的情況下,您還將具有用於選擇工具的命令,因此選擇也將被“記錄”到您的歷史記錄中。
一旦開始使用此模式,您可能會發現使用state
對象可以更好地構建整個應用程序, state
對象包裝在使用commit
操作進行所有訪問的store
中。 然后您可以免費獲得撤消重做。 有關此store
設計的實際標准,請參見redux
, vuex
和flux
。 盡管這些庫功能強大,但它們確實精簡且非常簡單。
命令模式的替代方法是記憶模式 ,您可以在每次執行操作時簡單地存儲畫布的當前狀態。 這需要更多的內存,通常只需要進行少量編輯即可。 不過,恢復較早的狀態應該很快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.