tiny_whiteboard readme

一個(gè)在線小白板

  • 支持繪制矩形、菱形、三角形、圓形、線段、箭頭、自由畫筆、文字、圖片

  • 繪制的圖形支持拖動(dòng)、縮放、旋轉(zhuǎn)、編組

  • 支持垂直方向無限滾動(dòng),一塊無限高度的白板

  • 支持放大縮小

  • 支持樣式設(shè)置

  • 橡皮擦功能

  • 支持導(dǎo)入、導(dǎo)出

  • 支持前進(jìn)回退

  • 本地存儲(chǔ)

  • 滾動(dòng)超出后支持一鍵回到內(nèi)容

  • 支持多選

  • 支持網(wǎng)格模式

  • 支持只讀模式,只讀模式支持隨意拖拽

  • 支持快捷鍵

安裝

npm i tiny-whiteboard

使用

提供一個(gè)寬高不為0的且定位不為static的容器元素,然后實(shí)例化tiny-whiteboard。

import TinyWhiteboard from "tiny-whiteboard";

// 創(chuàng)建實(shí)例
let app = new TinyWhiteboard({
    container: container
});
// 接下來可以調(diào)用實(shí)例`app`的各種方法或者監(jiān)聽各種事件。
// 具體可以參考/app項(xiàng)目的示例。

限制

1.因?qū)崿F(xiàn)方式原因,元素多了可能會(huì)存在性能和卡頓問題,請三思而后用。

2.因元素點(diǎn)擊檢測實(shí)現(xiàn)方式原因,目前不支持貝塞爾曲線或橢圓之類的圖形。

坐標(biāo)轉(zhuǎn)換相關(guān)

項(xiàng)目內(nèi)涉及到坐標(biāo)轉(zhuǎn)換相關(guān)的比較復(fù)雜和凌亂,如果沒有搞清楚很容易迷失。大體上有以下這些:

1.鼠標(biāo)坐標(biāo)是相對屏幕的,需要轉(zhuǎn)換成相對容器的,也就是鼠標(biāo)坐標(biāo)的x、y需要減去容器和屏幕左側(cè)及上方的距離。

2.元素的坐標(biāo)都是相對容器坐標(biāo)系的,也就是屏幕坐標(biāo)系,原點(diǎn)在左上角,向右及向下為正方向,而畫布的坐標(biāo)在中心位置,也就是容器的中心點(diǎn),也是向右及向下為正方向,所以繪制元素時(shí)需要把元素坐標(biāo)轉(zhuǎn)換成畫布坐標(biāo),具體來說就是元素的x、y坐標(biāo)需要容器寬高的1/2。

3.畫布滾動(dòng)后,鼠標(biāo)滾動(dòng)時(shí)只支持垂直方向滾動(dòng),只讀模式下可以鼠標(biāo)按住畫布進(jìn)行任意拖動(dòng),滾動(dòng)只是單純記錄一個(gè)滾動(dòng)偏移量scrollXscrollY,元素的實(shí)際坐標(biāo)是沒有變化的,只是在繪制元素的時(shí)候加上了scrollXscrollY,向上和向右滾動(dòng)時(shí)scroll值為正,向下和向左滾動(dòng)為負(fù),元素的x、y坐標(biāo)需要減去scrollX、scrollY。

4.畫布縮放后,縮放是應(yīng)用在畫布整體上,元素的實(shí)際位置和大小是沒有變化的,所以當(dāng)檢測位置時(shí)鼠標(biāo)的位置需要反向縮放才能對應(yīng)到元素的實(shí)際坐標(biāo),具體來說就是鼠標(biāo)坐標(biāo)先轉(zhuǎn)成畫布坐標(biāo),然后除以縮放值,最后再轉(zhuǎn)換屏幕坐標(biāo)。

5.當(dāng)元素旋轉(zhuǎn)后,元素的大小和位置的值是沒有變化的,只是通過rotate值進(jìn)行了旋轉(zhuǎn),所以當(dāng)通過鼠標(biāo)位置檢測元素時(shí),鼠標(biāo)的位置需要以元素的中心為旋轉(zhuǎn)中心,反向進(jìn)行旋轉(zhuǎn),然后再進(jìn)行計(jì)算。

6.當(dāng)開啟網(wǎng)格時(shí),坐標(biāo)會(huì)和網(wǎng)格對齊,也就是坐標(biāo)需要對網(wǎng)格的大小取余,然后減去該余數(shù)。

文檔

1.實(shí)例化

<div id="container"></div>
import TinyWhiteboard from "tiny-whiteboard";

// 創(chuàng)建實(shí)例
let app = new TinyWhiteboard({
    container: document.getElementById('container')
});

實(shí)例化選項(xiàng)

字段名稱 類型 默認(rèn)值 描述 是否必填
container Element 容器元素
drawType String selection 當(dāng)前畫布的繪制模式,比如選擇模式、矩形繪制模式、自由畫筆模式等等
state Object {} 畫布狀態(tài),對象,具體的屬性請參考表格1-1

表格1-1 畫布狀態(tài)對象state的屬性

字段名稱 類型 默認(rèn)值 描述
scale Number 1 畫布的縮放值,0-1
scrollX Number 0 畫布水平方向的滾動(dòng)偏移量
scrollY Number 0 畫布垂直方向的滾動(dòng)偏移量
scrollStep Number 50 畫布滾動(dòng)步長
backgroundColor String 畫布背景顏色
strokeStyle(v0.1.11+) String #000000 默認(rèn)線條顏色
fillStyle(v0.1.11+) String transparent 默認(rèn)填充顏色
fontFamily(v0.1.11+) String 微軟雅黑, Microsoft YaHei 默認(rèn)文字字體
fontSize(v0.1.11+) Number 18 默認(rèn)文字字號(hào)
dragStrokeStyle(v0.1.11+) String #666 選中元素的拖拽元素的默認(rèn)線條顏色
showGrid Boolean false 畫布是否顯示網(wǎng)格
readonly Boolean false 畫布是否是只讀模式
gridConfig Object {size: 20,strokeStyle: "#dfe0e1",lineWidth: 1} 畫布網(wǎng)格配置,size(網(wǎng)格大?。?、strokeStyle(網(wǎng)格線條顏色)、lineWidth(網(wǎng)格線條寬度)

實(shí)例屬性

屬性名稱 類型 描述
opts Object 實(shí)例化選項(xiàng)
container Element 容器元素
drawType String 畫布當(dāng)前繪制模式
canvas Element 主畫布元素
ctx Object 主畫布元素的繪圖上下文
state Object 畫布當(dāng)前狀態(tài)

實(shí)例方法

undo()

回退。

redo()

前進(jìn)。

setActiveElementStyle(style)

為畫布當(dāng)前激活的元素設(shè)置樣式。

  • style:樣式對象,object類型,具體屬性請參考表格1-2。

表格1-2 元素樣式對象style屬性

屬性名 類型 默認(rèn)值 描述
strokeStyle String #000000 線條顏色
fillStyle String transparent 填充顏色
lineWidth String small 線條寬度,small(2px)、middle(4px)、large(6px)
lineDash Number 0 線條虛線大小
globalAlpha Number 1 透明度
fontSize Number 18 字號(hào),文本元素特有樣式
lineHeightRatio Number 1.5 行高,文本元素特有樣式
fontFamily String 微軟雅黑, Microsoft YaHei 字體,文本元素特有樣式

setSelectedElementStyle(style)

為當(dāng)前多選元素設(shè)置樣式。

  • style:樣式對象,可參考表格1-2。

setCurrentElementsStyle(style)

為當(dāng)前激活或選中的元素設(shè)置樣式。

  • style:樣式對象,可參考表格1-2。

cancelActiveElement()

移除當(dāng)前激活元素,即取消當(dāng)前激活元素的激活狀態(tài)。

deleteActiveElement()

從畫布中刪除當(dāng)前的激活元素。

deleteCurrentElements()

從畫布中刪除當(dāng)前激活或選中的元素。

copyCurrentElement()

復(fù)制當(dāng)前激活或選中的元素。只是復(fù)制操作,如果需要粘貼需要調(diào)用下面的pasteCurrentElement()方法。

cutCurrentElement()

剪切當(dāng)前激活或選中的元素。只是剪切操作,如果需要粘貼需要調(diào)用下面的pasteCurrentElement()方法。

pasteCurrentElement(useCurrentEventPos = false)

粘貼被復(fù)制或剪切的元素。

  • useCurrentEventPos:是否使用鼠標(biāo)當(dāng)前的位置,默認(rèn)為false,偏移原圖形20px,傳true則粘貼到鼠標(biāo)當(dāng)前所在的位置。

copyPasteCurrentElements()

復(fù)制粘貼當(dāng)前元素。

exportImage(opt)

導(dǎo)出為圖片

  • opt:導(dǎo)出選項(xiàng),Object,具體屬性如下:

    • opt.type:導(dǎo)出圖片類型,String,默認(rèn)為image/png;

    • opt.renderBg:是否顯示背景,Boolean,默認(rèn)為true;

    • opt.useBlob:是否以blob類型導(dǎo)出,Boolean,默認(rèn)為DataURL類型,以blob類型導(dǎo)出時(shí)函數(shù)的返回值是一個(gè)promise;

    • opt.paddingX:繪制的水平內(nèi)邊距,Number,默認(rèn)為10像素;

    • opt.paddingY:繪制的垂直內(nèi)邊距,Number,默認(rèn)為10像素;

    • opt.onlySelected:(v0.1.7+)。是否僅導(dǎo)出被選中的元素,Boolean,默認(rèn)為false;

exportJson()

導(dǎo)出為json數(shù)據(jù)。

showGrid()

顯示網(wǎng)格。

hideGrid()

隱藏網(wǎng)格。

updateGrid(config)

更新網(wǎng)格配置。

  • config:配置對象,Object,具體配置可參考表格1-1 的gridConfig屬性。

setEditMode()

設(shè)置為編輯模式。

setReadonlyMode()

設(shè)置為只讀模式。

setData(data, noEmitChange)

設(shè)置畫布數(shù)據(jù),包括狀態(tài)數(shù)據(jù)及元素?cái)?shù)據(jù)。

  • data:數(shù)據(jù),一般是通過調(diào)用getData()方法獲取到的數(shù)據(jù)進(jìn)行回填,Object,包括以下兩個(gè)字段:

    • data.state:畫布狀態(tài)數(shù)據(jù),Object,詳情請參考表格1-1。

    • data.elements:畫布上的元素?cái)?shù)據(jù),Array。

    • noEmitChange:禁止觸發(fā)歷史記錄收集及change事件觸發(fā),Boolean,默認(rèn)為false,某些場景下需要設(shè)置為true避免無限循環(huán)。

resize()

當(dāng)容器的大小變化后需要調(diào)用該方法。

updateState(data)

更新畫布狀態(tài)數(shù)據(jù),只是更新狀態(tài)數(shù)據(jù),不會(huì)觸發(fā)重新渲染,如有需要重新渲染或其他操作需要自行調(diào)用相關(guān)方法。

  • data: 畫布狀態(tài),Object,詳情可參考表格1-1。

updateCurrentType(drawType)

更新畫布當(dāng)前繪制模式。

  • drawType:繪制模式,String,可選值如下表格所示:
描述
selection 選擇模式,該模式下可以單擊某個(gè)元素進(jìn)行激活元素,或進(jìn)行多選元素操作
rectangle 矩形繪制模式
diamond 菱形繪制模式
triangle 三角形繪制模式
circle 圓形繪制模式
line 線段繪制模式
arrow 箭頭繪制模式
freedraw 自由畫筆繪制模式
text 文字繪制模式
image 圖片繪制模式
eraser 橡皮擦模式

deleteElement(element)

從畫布刪除某個(gè)元素。

copyElement(element, notActive = false, pos)

復(fù)制指定的元素。

  • notActive:只復(fù)制而不激活,Boolean,默認(rèn)為false。

  • pos:是否指定坐標(biāo),否則會(huì)偏移原位置20像素,Object,格式為{x, y}。

empty()

清空元素。

zoomIn(num)

放大。

  • num:放大值,Number,默認(rèn)為0.1。

zoomOut(num)

縮小。

  • num:縮小值,Number,默認(rèn)為0.1。

setZoom(zoom)

設(shè)置指定縮放值。

  • zoomNumber,0-1。

fit()

縮放移動(dòng)合適的值以適應(yīng)所有元素。

setBackgroundColor(color)

設(shè)置背景顏色。

getData()

獲取數(shù)據(jù),包括狀態(tài)數(shù)據(jù)及元素?cái)?shù)據(jù),可進(jìn)行持久化。

scrollTo(scrollX, scrollY)

滾動(dòng)至指定位置。

  • scrollX, scrollY:滾動(dòng)距離,Number。

scrollToCenter()

滾動(dòng)至中心,即定位到所有元素的中心位置。

resetCurrentType()

復(fù)位當(dāng)前畫布繪制模式到選擇模式。

selectAll()

選中所有元素。

on(eventName, callback, context)

監(jiān)聽事件。事件請見下方表格:

事件名稱 描述 回調(diào)參數(shù)
zoomChange 縮放時(shí)觸發(fā) scale(當(dāng)前縮放值)
scrollChange 滾動(dòng)時(shí)觸發(fā) scrollX(當(dāng)前水平滾動(dòng)值)、scrollY(當(dāng)前垂直滾動(dòng)值)
currentTypeChange 繪制模式變化時(shí)觸發(fā) drawType(當(dāng)前繪制模式)
change 畫布狀態(tài)數(shù)據(jù)變化或元素變化時(shí)觸發(fā) data(狀態(tài)和元素?cái)?shù)據(jù))
shuttle 前進(jìn)后退時(shí)觸發(fā) index(當(dāng)前指針)、length(當(dāng)前歷史記錄數(shù)量)
activeElementChange 激活元素變化事件 activeElement(當(dāng)前激活的元素)
multiSelectChange 多選元素選擇完成時(shí)觸發(fā) selectedElementList(當(dāng)前被多選選中的元素)
contextmenu(v0.1.5+) 右鍵菜單事件 e(事件對象)、elements(當(dāng)前激活或選中的元素)

emit(eventName, ...args)

觸發(fā)事件。

off(eventName, callback?)

解綁事件。

selectAll()

選中所有元素。

fit()

縮放以適應(yīng)所有元素。

updateActiveElementPosition(x, y)

v0.1.4+。更新當(dāng)前激活元素的位置。

updateActiveElementSize(width, height)

v0.1.4+。更新當(dāng)前激活元素的尺寸。

updateActiveElementRotate(rotate)

v0.1.4+。更新當(dāng)前激活元素的旋轉(zhuǎn)角度。

moveUpCurrentElement()

v0.1.5+。將當(dāng)前元素上移一層。

moveDownCurrentElement()

v0.1.5+。將當(dāng)前元素下移一層。

moveTopCurrentElement()

v0.1.5+。將當(dāng)前元素置于頂層。

moveBottomCurrentElement()

v0.1.5+。將當(dāng)前元素置于底層。

2.elements元素管理實(shí)例

可通過app.elements獲取到該實(shí)例。

實(shí)例屬性

屬性名稱 類型 描述
elementList Array 當(dāng)前畫布中的所有元素列表
activeElement Object 當(dāng)前激活的元素
isCreatingElement Boolean 當(dāng)前是否正在創(chuàng)建新元素
isResizing Boolean 當(dāng)前是否正在調(diào)整元素
resizingElement Object 當(dāng)前正在調(diào)整的元素

實(shí)例方法

hasElements()

當(dāng)前畫布上是否有元素。

getElementsNum()

v0.1.5+。獲取當(dāng)前畫布上的元素?cái)?shù)量。

addElement(element)

添加元素。不會(huì)觸發(fā)渲染,需要手動(dòng)調(diào)用app.render.render()方法重新渲染。

unshiftElement(element)

v0.1.5+。向前添加元素。

insertElement(element, index)

v0.1.5+。添加元素到指定位置。

getElementIndex(element)

v0.1.5+。獲取元素在元素列表里的索引。

deleteElement(element)

刪除元素。不會(huì)觸發(fā)渲染,需要手動(dòng)調(diào)用app.render.render()方法重新渲染。

deleteAllElements()

刪除全部元素。不會(huì)觸發(fā)渲染,需要手動(dòng)調(diào)用app.render.render()方法重新渲染。

hasActiveElement()

是否存在激活元素。

setActiveElement(element)

替換激活的元素。不會(huì)觸發(fā)渲染,需要手動(dòng)調(diào)用app.render.render()方法重新渲染。

cancelActiveElement()

取消當(dāng)前激活元素。不會(huì)觸發(fā)渲染,需要手動(dòng)調(diào)用app.render.render()方法重新渲染。

createElement(opts = {}, callback = () => {}, ctx = null, notActive)

創(chuàng)建元素。不會(huì)觸發(fā)渲染,需要手動(dòng)調(diào)用app.render.render()方法重新渲染。

  • opts:創(chuàng)建元素的選項(xiàng);

  • callback:回調(diào)函數(shù),回調(diào)參數(shù):element(創(chuàng)建的元素);

  • ctx:回調(diào)函數(shù)的上下文對象;

  • notActive:是否不要激活該新創(chuàng)建的元素,默認(rèn)為false;

serialize(stringify)

序列化當(dāng)前畫布上的所有元素,可用來持久化數(shù)據(jù)。

  • stringify:默認(rèn)為false,返回json對象類型,傳true則返回字符串類型。

createElementsFromData(elements = [])

根據(jù)元素?cái)?shù)據(jù)創(chuàng)建元素,即根據(jù)持久化的數(shù)據(jù)反向創(chuàng)建元素到畫布上。不會(huì)觸發(fā)渲染,需要手動(dòng)調(diào)用app.render.render()方法重新渲染。

3.render渲染類

可通過app.render獲取到該實(shí)例。

該實(shí)例的所有方法都已代理到app實(shí)例上,可以直接通過app.xxx調(diào)用。

4.coordinate坐標(biāo)轉(zhuǎn)換實(shí)例

可通過app.coordinate獲取到該實(shí)例。

實(shí)例方法

addScrollY(y)

加上畫布當(dāng)前垂直的滾動(dòng)距離。

addScrollX(x)

加上畫布當(dāng)前水平的滾動(dòng)距離。

subScrollY(y)

減去畫布當(dāng)前垂直的滾動(dòng)距離。

subScrollX(x)

減去畫布當(dāng)前水平的滾動(dòng)距離。

transformToCanvasCoordinate(x, y)

屏幕坐標(biāo)轉(zhuǎn)換成畫布坐標(biāo)。

transformToScreenCoordinate(x, y)

畫布轉(zhuǎn)換轉(zhuǎn)屏幕坐標(biāo)。

transform(x, y)

綜合轉(zhuǎn)換,屏幕坐標(biāo)轉(zhuǎn)畫布坐標(biāo),再減去滾動(dòng)值。

windowToContainer(x, y)

相對窗口的坐標(biāo)轉(zhuǎn)換成相對容器的,用于當(dāng)容器非全屏的時(shí)候。

containerToWindow(x, y)

相對容器的坐標(biāo)轉(zhuǎn)換成相對窗口的,用于當(dāng)容器非全屏的時(shí)候。

scale(x, y)

屏幕坐標(biāo)在應(yīng)用畫布縮放后的位置。

reverseScale(x, y)

屏幕坐標(biāo)在反向應(yīng)用畫布縮放后的位置。

gridAdsorbent(x, y)

網(wǎng)格吸附。

5.event事件實(shí)例

可通過app.event獲取該實(shí)例。

實(shí)例方法

on(eventName, callback, context)

監(jiān)聽事件。事件請見下方表格:

事件名稱 描述 回調(diào)參數(shù)
mousedown 鼠標(biāo)按下事件 e、事件實(shí)例對象event
mousemove 鼠標(biāo)移動(dòng)事件 e、事件實(shí)例對象event
mouseup 鼠標(biāo)松開事件 e、事件實(shí)例對象event
dblclick 雙擊事件 e、事件實(shí)例對象event
mousewheel 鼠標(biāo)滾動(dòng)事件 dir(滾動(dòng)方向,down代表向下,up代表向上)
keydown 按鍵按下事件 e(原始事件對象)、事件實(shí)例對象event
keyup 按鍵松開事件 e(原始事件對象)、事件實(shí)例對象event
  • e:事件對象,非原始事件對象,為處理后的事件對象,格式如下:

    {
          originEvent: e,// 原始事件對象
          unGridClientX,
          unGridClientY,
          clientX,
          clientY
    }
    

    clientXclientY是經(jīng)過了一系列轉(zhuǎn)換的:

    1.將相當(dāng)于瀏覽器窗口左上角的坐標(biāo)轉(zhuǎn)換成相對容器左上角

    2.如果畫布進(jìn)行了縮放,那么鼠標(biāo)坐標(biāo)要反向進(jìn)行縮放

    3.x、y坐標(biāo)加上了畫布水平和垂直的滾動(dòng)距離scrollXscrollY

    4.如果開啟了網(wǎng)格,那么坐標(biāo)要吸附到網(wǎng)格上

    unGridClientX、unGridClientYclientXclientY的區(qū)別是沒有經(jīng)過第四步的處理。用于位置檢測等不需要吸附的場景。

    對于第三步來說,向下滾動(dòng)scroll值為正,而canvas坐標(biāo)系向下為正,所以要造成元素向上滾動(dòng)的效果顯示的時(shí)候元素的y坐標(biāo)需要減去scroll值,但是元素真實(shí)的y值并未改變,所以對于鼠標(biāo)坐標(biāo)來說需要加上scroll值,這樣才能匹配元素真實(shí)的y坐標(biāo),水平方向也是一樣的。

  • event:事件類的實(shí)例對象,存在以下屬性:

    屬性名稱 類型 描述
    isMousedown Boolean 鼠標(biāo)是否按下
    mousedownPos Object 按下時(shí)的鼠標(biāo)位置,格式見下方。
    mouseOffset Object 鼠標(biāo)當(dāng)前位置和按下時(shí)位置的差值,格式見下方。
    lastMousePos Object 記錄上一時(shí)刻的鼠標(biāo)位置,格式為{x, y},經(jīng)過處理的坐標(biāo)。
    mouseDistance Number 前一瞬間的鼠標(biāo)移動(dòng)距離。
    lastMouseTime Number 記錄上一時(shí)刻的時(shí)間,時(shí)間戳格式。
    mouseDuration Number 前一瞬間經(jīng)過的時(shí)間,單位為毫秒。
    mouseSpeed Number 前一瞬間的鼠標(biāo)移動(dòng)速度,單位為px/ms。
    • mousedownPos屬性格式:

      {
            x: 0,// 經(jīng)過了以上4步轉(zhuǎn)換后的坐標(biāo)
            y: 0,
            unGridClientX: 0,// 經(jīng)過了除第4步的坐標(biāo)
            unGridClientY: 0,
            originClientX: 0,// 原始沒有經(jīng)過任何處理的坐標(biāo)
            originClientY: 0
      }
      
    • mouseOffset屬性格式:

      {
            x: 0,// 經(jīng)過了以上4步轉(zhuǎn)換后的坐標(biāo)差數(shù)據(jù)
            y: 0,
            originX: 0,// 原始沒有經(jīng)過任何處理的坐標(biāo)差數(shù)據(jù)
            originY: 0
      }
      

emit(eventName, ...args)

觸發(fā)事件。

off(eventName, callback?)

解綁事件。

6.cursor鼠標(biāo)樣式實(shí)例

可通過app.cursor獲取該實(shí)例。

實(shí)例方法

set(type = "default")

設(shè)置鼠標(biāo)指針樣式。

hide()

隱藏鼠標(biāo)指針。

reset()

復(fù)位鼠標(biāo)指針。

setCrosshair()

設(shè)置為 ? 字型。

setMove()

設(shè)置為 可移動(dòng) 狀態(tài)。

setEraser()

設(shè)置為橡皮擦樣式。

7.history歷史記錄管理實(shí)例

可通過app.history獲取該實(shí)例。

實(shí)例方法

undo()

后退。

redo()

前進(jìn)。

add(data)

添加一個(gè)歷史記錄數(shù)據(jù),data一般是通過app.getData()獲取到的數(shù)據(jù)。

clear()

清空歷史記錄數(shù)據(jù)。

8.export導(dǎo)入導(dǎo)出實(shí)例

可通過app.export獲取該實(shí)例。

實(shí)例方法

exportImage(opt)

導(dǎo)出為圖片,參數(shù)詳見前面的文檔。

exportJson()

導(dǎo)出為json數(shù)據(jù)。

9.background背景設(shè)置實(shí)例

可通過app.background獲取該實(shí)例。

實(shí)例方法

addBackgroundColor()

添加背景顏色,背景色值為app.state.backgroundColor。

remove()

移除背景。

canvasAddBackgroundColor(ctx, width, height, backgroundColor)

給一個(gè)canvas設(shè)置背景顏色,非css樣式。

  • ctxcanvas繪圖上下文。

10.selection多選實(shí)例

可通過app.selection獲取該實(shí)例。

實(shí)例方法

selectElements(elements = [])

選中指定元素。

copySelectionElements(pos)

復(fù)制粘貼當(dāng)前選中的元素。

  • pos:是否指定粘貼的坐標(biāo),否則會(huì)偏移原位置20像素,Object,格式為{x, y}。

getSelectionElements()

獲取當(dāng)前被選中的元素。

hasSelectionElements()

當(dāng)前是否存在被選中元素。

deleteSelectedElements()

從畫布刪除當(dāng)前選中的元素。

setSelectedElementStyle(style)

為當(dāng)前選中的元素設(shè)置樣式。

11.mode模式實(shí)例

可通過app.mode獲取該實(shí)例。

實(shí)例方法

setEditMode()

設(shè)置為編輯模式。

setReadonlyMode()

設(shè)置為只讀模式。

12.imageEdit圖片選擇實(shí)例

可通過app.imageEdit獲取該實(shí)例。

13.textEdit文字編輯實(shí)例

可通過app.textEdit獲取該實(shí)例。

14.keyCommand快捷鍵實(shí)例

可通過app.keyCommand獲取該實(shí)例。

實(shí)例屬性

屬性名稱 類型 描述
keyMap Object 按鍵的名稱到keyCode映射。

實(shí)例方法

bindEvent()

綁定keydown事件。

unBindEvent()

解綁keydown事件。如果你的事件會(huì)和快捷鍵沖突,那么可以暫時(shí)調(diào)用該方法解綁快捷鍵的keydown事件。

addShortcut(key, fn, ctx)

添加快捷鍵命令。

  • key:快捷鍵,允許三種組合方式:單個(gè)按鍵(如Enter)、或(Tab | Insert)、與(Shift + a),具體的按鍵名稱可以app.keyCommand.keyMap查看。

  • fn:快捷鍵對應(yīng)的執(zhí)行函數(shù)。

  • ctx:函數(shù)的上下文。

removeShortcut(key, fn)

移除快捷鍵命令。

15.工具方法

可以通過如下方式獲取到內(nèi)置的工具方法:

import TinyWhiteboard from "tiny-whiteboard";

TinyWhiteboard.utils.xxx

createCanvas(width,height,opt = { noStyle: false, noTranslate: false, className: '' })

創(chuàng)建canvas元素。

  • width:寬度

  • height:高度

  • opt:選項(xiàng)

    • opt.noStyle:是否不需要設(shè)置樣式,如果需要的話,那么會(huì)給canvas元素加上left=0top=0的絕對定位樣式;
    • noTranslate:是否不需要將畫布原點(diǎn)移動(dòng)到畫布中心;
    • className:添加到畫布元素上的類名;

getTowPointDistance(x1, y1, x2, y2)

計(jì)算兩點(diǎn)之間的距離。

getPointToLineDistance(x, y, x1, y1, x2, y2)

計(jì)算點(diǎn)到直線的距離。

checkIsAtSegment(x, y, x1, y1, x2, y2, dis = 10)

檢查是否點(diǎn)擊到了一條線段。

  • dis:點(diǎn)距離線段多少距離內(nèi)都認(rèn)為是點(diǎn)擊到了;

radToDeg(rad)

弧度轉(zhuǎn)角度。

degToRad(deg)

角度轉(zhuǎn)弧度。

getTowPointRotate(cx, cy, tx, ty, fx, fy)

計(jì)算中心點(diǎn)相同的兩個(gè)坐標(biāo)相差的角度數(shù)。

getRotatedPoint(x, y, cx, cy, rotate)

獲取坐標(biāo)經(jīng)指定中心點(diǎn)旋轉(zhuǎn)指定角度的坐標(biāo),順時(shí)針還是逆時(shí)針rotate傳正負(fù)即可。

getElementCenterPoint(element)

獲取元素的中心點(diǎn)坐標(biāo)。

  • element:元素,Object,必要的字段如為{ x, y, width, height };

getElementCornerPoint(element, dir)

獲取元素的四個(gè)角坐標(biāo)。

  • element:元素,Object,必要的字段如為{ x, y, width, height };

  • dir:要獲取的哪個(gè)角,可選項(xiàng)為:topLeft、topRight、bottomRightbottomLeft;

getElementRotatedCornerPoint(element, dir)

獲取元素旋轉(zhuǎn)后的四個(gè)角坐標(biāo)。參數(shù)同上。

checkPointIsInRectangle(x, y, rx, ry, rw, rh)

判斷一個(gè)坐標(biāo)是否在一個(gè)矩形內(nèi)。第三個(gè)參數(shù)可以直接傳一個(gè)帶有x、ywidth、height屬性的元素對象。

getBoundingRect(pointArr = [], returnCorners = false)

獲取多個(gè)點(diǎn)的外包圍框。

返回?cái)?shù)據(jù):

{
  x,
  y,
  width,
  height,
}
  • pointArr:點(diǎn)數(shù)組,數(shù)組的每一項(xiàng)的格式為:[x, y]

  • returnCorners:v0.1.4+。以四個(gè)角坐標(biāo)的形式返回:

[
  [x0, y0],
  [x1, y1],
  [x2, y2],
  [x3, y3],
]

deepCopy(obj)

簡單深拷貝,只能用于拷貝純粹的對象。

getFontString(fontSize, fontFamily)

拼接canvas文字字體字號(hào)字符串。

splitTextLines(text)

將文本切割成行,返回一個(gè)數(shù)組。

getTextActWidth(text, style)

計(jì)算文本的實(shí)際渲染寬度。

  • style:對象類型,包含fontSizefontFamily兩個(gè)屬性;

getWrapTextMaxRowTextNumber(text)

計(jì)算換行文本的最長一行的文字?jǐn)?shù)量。

throttle(fn, ctx, time = 100)

節(jié)流函數(shù)。

downloadFile(file, fileName)

下載文件。

getElementCorners(element)

獲取元素的四個(gè)角的坐標(biāo),應(yīng)用了旋轉(zhuǎn)之后的,返回一個(gè)數(shù)組。

getMultiElementRectInfo(elementList = [])

獲取多個(gè)元素的最外層包圍框信息。返回{minx,maxx,miny,maxy};

createImageObj(url)

創(chuàng)建圖片對象,即new Image()的圖片對象,返回promise。

16.圖形繪制工具方法

可以通過如下方式獲取到內(nèi)置的圖形繪制工具方法:

import TinyWhiteboard from "tiny-whiteboard";

TinyWhiteboard.draw.xxx

drawRect(ctx, x, y, width, height, fill = false)

繪制矩形。

  • ctxcanvas繪圖上下文。

  • fill:是否進(jìn)行填充。

drawDiamond(ctx, x, y, width, height, fill = false)

繪制菱形。

drawTriangle(ctx, x, y, width, height, fill = false)

繪制三角形。

drawCircle(ctx, x, y, r, fill = false)

繪制圓形。

drawLine(ctx, points)

繪制折線。

  • points:折線的端點(diǎn)列表。Array,數(shù)組的每一項(xiàng)為[x, y]。

drawArrow(ctx, pointArr)

繪制箭頭。

pointArr:箭頭的首尾兩個(gè)頂點(diǎn)坐標(biāo),Array,數(shù)組的每一項(xiàng)為[x, y]。

drawLineSegment(ctx, mx, my, tx, ty, lineWidth = 0)

繪制線段。

  • lineWidth:線寬

drawText(ctx, textObj, x, y)

繪制文字。

  • textObj:文本數(shù)據(jù),Object,字段如下:
    • textObj.text:文本字符串;
    • textObj.style:文本屬性,Object,需包含三個(gè)字段:fontSize、fontFamilylineHeightRatio(行高,需為數(shù)字類型,比如1.5,代表行高1.5倍);

drawImage(ctx, element, x, y, width, height)

繪制圖片。

element:圖片數(shù)據(jù),Object,字段如下:

element.ratio:圖片的長寬比;

element.imageObj:要繪制到canvas上的圖片對象或其他能被canvas繪制的對象;

17.圖形點(diǎn)擊檢測工具方法

可以通過如下方式獲取到內(nèi)置的圖形點(diǎn)擊檢測工具方法:

import TinyWhiteboard from "tiny-whiteboard";

TinyWhiteboard.checkHit.xxx

checkIsAtMultiSegment(segments, rp)

檢測是否點(diǎn)擊到折線上。

  • segments:折線的端點(diǎn)數(shù)組,Array,數(shù)組的每一項(xiàng)為[fx, fy, tx, ty],即線段的首尾兩個(gè)坐標(biāo);

  • rp:要檢測的點(diǎn),格式為{x, y};

checkIsAtRectangleEdge(element, rp)

檢測是否點(diǎn)擊到矩形邊緣。

  • elementObject,需包含字段{ x, y, width, height }

checkIsAtRectangleInner(element, rp)

檢測是否點(diǎn)擊到矩形內(nèi)部。

checkIsAtCircleEdge(element, rp)

檢測是否點(diǎn)擊到圓的邊緣,圓的半徑為widthheight中的較小值的一半。

checkIsAtLineEdge(element, rp)

檢測是否點(diǎn)擊到線段邊緣。

  • elementObject,格式如下:
{
    pointArr: [
        [x, y],
        ...
    ]
}

checkIsAtFreedrawLineEdge(element, rp)

檢測是否點(diǎn)擊到自由畫筆圖形邊緣。element字段同上。

checkIsAtDiamondEdge(element, rp)

檢測是否點(diǎn)擊到菱形邊緣。

  • elementObject,需包含字段{ x, y, width, height }

checkIsAtTriangleEdge(element, rp)

檢測是否點(diǎn)擊到三角形邊緣。

  • elementObject,需包含字段{ x, y, width, height }

checkIsAtArrowEdge(element, rp)

檢測是否點(diǎn)擊到箭頭邊緣。

  • elementObject,格式如下:
{
    pointArr: [
        [x1, y1],
        [x2, y2]
    ]
}

18.內(nèi)置元素類

可以通過以下方式獲取到某個(gè)元素類:

import TinyWhiteboard from "tiny-whiteboard";

TinyWhiteboard.elements.xxx

目前存在以下元素類:

類名 簡介
BaseElement 基礎(chǔ)元素類,不用來實(shí)例化
Arrow 箭頭元素類,繼承自BaseElement
Circle 正圓元素類,繼承自BaseElement
Diamond 菱形元素類,繼承自BaseElement
Image 圖片元素類,繼承自BaseElement
Rectangle 矩形元素類,繼承自BaseElement
Text 文本元素類,繼承自BaseElement
Triangle 三角形元素類,繼承自BaseElement
BaseMultiPointElement 由多個(gè)坐標(biāo)組成的元素的基礎(chǔ)類,繼承自BaseElement,不用來實(shí)例化
Freedraw 自由畫筆元素類,繼承自BaseMultiPointElement
Line 線段/折線元素類,繼承自BaseMultiPointElement
DragElement 拖拽元素類,繼承自BaseElement,每個(gè)元素都會(huì)實(shí)例化一個(gè)該類,用來當(dāng)元素激活時(shí)顯示拖拽框及進(jìn)行元素調(diào)整操作
MultiSelectElement 用于多選情況下的虛擬元素類,繼承自BaseElement

基礎(chǔ)元素實(shí)例屬性

屬性名稱 類型 描述
type String 元素類型
isActive Boolean 是否被激活
isSelected Boolean 是否被多選選中
x、y Number 元素的位置
width、height Number 元素的寬高
rotate Number 元素的旋轉(zhuǎn)角度
style Object 元素的樣式對象
pointArr Array 由多個(gè)點(diǎn)組成的元素(Arrow、Line、Freedraw)的特有屬性。組成元素的點(diǎn)坐標(biāo)數(shù)組。

基礎(chǔ)元素實(shí)例方法

on(eventName, callback, context)

v0.1.4+。監(jiān)聽元素事件。事件請見下方表格:

事件名稱 描述 回調(diào)參數(shù)
elementPositionChange 元素x、y坐標(biāo)發(fā)生變化時(shí)觸發(fā) x、y
elementSizeChange 元素width、height大小發(fā)生變化時(shí)觸發(fā) width、height
elementRotateChange 元素rotate旋轉(zhuǎn)角度發(fā)生變化時(shí)觸發(fā) rotate

serialize()

序列化元素,返回的數(shù)據(jù)可用于進(jìn)行持久化及回顯。

render()

渲染元素。

setStyle(style = {})

設(shè)置元素的繪圖樣式。

move(ox, oy)

移動(dòng)元素,在元素當(dāng)前的位置上累加ox、oy。

updatePos(x, y)

更新元素的位置。

updateSize(width, height)

更新元素的寬高。

updateRect(x, y, width, height)

更新元素的位置及寬高。

offsetRotate(or)

旋轉(zhuǎn)元素,在元素當(dāng)前的旋轉(zhuǎn)角度上累加or角度。

rotateByCenter(rotate, cx, cy)

根據(jù)指定中心點(diǎn)旋轉(zhuǎn)元素的各個(gè)點(diǎn)。對于由多個(gè)點(diǎn)坐標(biāo)組成的元素來說是修改其pointArr坐標(biāo),對于其他元素來說是修改其x、y坐標(biāo)。

isHit(x, y)

檢測該坐標(biāo)是否能擊中該元素。

getEndpointList()

v0.1.4+。獲取圖形應(yīng)用了旋轉(zhuǎn)之后的端點(diǎn)列表??捎糜谟?jì)算元素的外包圍框數(shù)據(jù)。

License

MIT

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容