【1-快速上手】

文章目錄

  • 前言
  • 簡介
    • 什么是 Konva?
    • 安裝 Konva
  • 概述
    • 它是如何工作的?
    • 基本形狀
    • 樣式
    • 事件
    • 拖放
    • 濾鏡
    • 動畫
    • 選擇器
    • 序列化與反序列化
    • 性能


前言

結合項目實際業務需求,在 Fabric、Konva 等圖形化框架中,我選擇了性能表現好的 Konva。首先去學習官方文檔和示例,以下是 Konva 的相關文檔地址:

  • Konva 官網
  • Github
  • Konva 中文文檔

我是在豆包的瀏覽器中打開 Konva 官網,其自帶全文翻譯功能,可以快速查看中文內容。

簡介

什么是 Konva?

Konva 是一個 HTML5 畫布 JavaScript 框架,它通過為桌面和移動應用程序實現畫布交互性來擴展 2D 上下文。

Konva 可為桌面和移動應用程序實現高性能動畫、過渡效果、節點嵌套、分層、過濾、緩存、事件處理等諸多功能。

你可以在舞臺上繪制圖形,為它們添加事件監聽器,對它們進行移動、縮放和旋轉操作,這些操作與其他形狀相互獨立,以支持高性能動畫,即使你的應用程序使用了數千個圖形。

安裝 Konva

下面列出了三種安裝命令,任選一種:

npm install konva --saveyarn add konvapnpm add konva

概述

它是如何工作的?

所有內容都從 Konva.Stage 開始,它包含若干用戶圖層(Konva.Layer)。

每一層都有兩個 <canvas> 渲染器:一個場景渲染器(Scene Canvas)和一個圖像命中渲染器(Hit Canvas)。場景渲染器是你能看到的內容,而圖像命中渲染器是一個特殊的隱藏畫布,用于高性能的事件檢測。

在 Hit Canvas 中,所有元素會被繪制為唯一顏色標識(如 rgb(1, 0, 0)對應 ID 為 1 的元素)。這種顏色與可視元素的樣式無關,僅用于身份識別。當觸發鼠標/觸摸事件時,Konva 通過 context.getImageData()讀取 Hit Canvas 對應坐標的像素值,將像素值轉換為元素 ID,實現毫秒級事件目標識別。

每一層都可以包含形狀、形狀組或其他組的組。Stage(舞臺)、layers(圖層)、groups(組)和 shapes(圖形)都是虛擬節點,類似于 HTML 頁面中的 DOM 節點。

注意:創建一個 Layer(圖層)時,會自動創建 2 個 Canvas 元素,從性能方面考慮,最多創建 3 個 Layer(圖層)。

以下是一個節點結構示例層級:

                   Stage|+------+------+|             |Layer         Layer|             |+-----+-----+     Shape|           |Group       Group|           |+       +---+---+|       |       |Shape   Group    Shape|+|Shape

所有節點都可以設置樣式和進行變換。雖然 Konva 有預構建的形狀,如矩形、圓形、圖像、精靈圖、文本、線條、多邊形、正多邊形、路徑、星形等,但你也可以通過實例化 Shape 類并創建一個繪制函數來創建自定義形狀。

一旦你使用圖層和形狀搭建好了一個場景,就可以綁定事件監聽器、變換節點、運行動畫、應用濾鏡等等。

最小代碼示例:

// first we need to create a stage
var stage = new Konva.Stage({container: 'container', // id of container <div>width: 500,height: 500,
})// then create layer
var layer = new Konva.Layer()// create our shape
var circle = new Konva.Circle({x: stage.width() / 2,y: stage.height() / 2,radius: 70,fill: 'red',stroke: 'black',strokeWidth: 4,
})// add the shape to the layer
layer.add(circle)// add the layer to the stage
stage.add(layer)

基本形狀

Konva.js 支持以下形狀:矩形、圓形、橢圓、直線、多邊形、樣條曲線、不規則圖形、圖像、文本、文本路徑、星形、標簽、SVG 路徑、正多邊形。你還可以創建自定義形狀:

var triangle = new Konva.Shape({sceneFunc: function (context) {context.beginPath()context.moveTo(20, 50)context.lineTo(220, 80)context.quadraticCurveTo(150, 100, 260, 170)context.closePath()// special Konva.js methodcontext.fillStrokeShape(this)},fill: '#00D2FF',stroke: 'black',strokeWidth: 4,
})

樣式

每個形狀都支持以下樣式屬性:

  • 填充。純色、漸變或圖像
  • 描邊(顏色,寬度)
  • 陰影(顏色、偏移量、不透明度、模糊度)
  • 不透明度
var pentagon = new Konva.RegularPolygon({x: stage.width() / 2,y: stage.height() / 2,sides: 5,radius: 70,fill: 'red',stroke: 'black',strokeWidth: 4,shadowOffsetX: 20,shadowOffsetY: 25,shadowBlur: 40,opacity: 0.5,
})

事件

使用 Konva,你可以輕松監聽用戶輸入事件(click、dblclick、mouseover、tap、dbltap、touchstart 等)、屬性更改事件(scaleXChange、fillChange)以及拖放事件(dragstart、dragmove、dragend)。

circle.on('mouseout touchend', function () {console.log('user input')
})circle.on('xChange', function () {console.log('position change')
})circle.on('dragend', function () {console.log('drag stopped')
})

參閱綁定事件示例

拖放

注意:拖拽 drag 和 拖放 drop 是不一樣的。拖拽 drag 是指在畫布上移動元素,而拖放 drop 是指在畫布上將元素放置在某個位置。

Konva 有內置的拖拽支持。目前沒有 drop 事件(drop、dragenter、dragleave、dragover),但通過框架實現它們非常容易,參閱拖放事件示例。

要啟用拖放功能,只需將屬性 draggable 設置為 true。

接下來你就可以參閱 drag&drop 事件和設置移動限制

濾鏡

Konva 提供了多種濾鏡:blur, invert, noise 等等。 參閱濾鏡 API

動畫

你可以通過兩種方式創建動畫:

  1. 通過 Konva.Animation Demo
  2. 通過 Konva.Tween Demo

選擇器

在構建大型應用程序時,在元素中使用搜索功能非常有用。Konva 可幫助您通過選擇器查找元素。您可以使用 find() 方法(返回集合)或 findOne() 方法(返回集合的第一個元素)。

var circle = new Konva.Circle({radius: 10,fill: 'red',id: 'face',name: 'red circle',
})
layer.add(circle)// then try to search// find by type
layer.find('Circle') // returns array of all circles// find by id
layer.findOne('#face')// find by name (like css class)
layer.find('.red')

序列化與反序列化

所有創建的對象都可以保存為 JSON 格式。你可以將其保存到服務器或本地存儲中。

var json = stage.toJSON()

此外,你可以從 JSON 中恢復對象:

var json ='{"attrs":{"width":578,"height":200},"className":"Stage","children":[{"attrs":{},"className":"Layer","children":[{"attrs":{"x":100,"y":100,"sides":6,"radius":70,"fill":"red","stroke":"black","strokeWidth":4},"className":"RegularPolygon"}]}]}'var stage = Konva.Node.create(json, 'container')

性能

Konva 提供了一些提升性能的工具。

主要的方法有:

1.緩存

Caching 允許你在 buffer canvas 里繪制元素,然后再通過 buffer canvas 繪制到場景,它能提升繪制復雜節點例如:文本、包含陰影或者描邊的圖形。 Demo

shape.cache()

2.圖層

框架支持創建任意數量的 <canvas>。如果你的應用包含復雜的背景和許多可以移動的圖形,你可以使用一個圖層顯示背景,另一個圖層顯示圖形,從而只更新圖形而不更新背景。 Demo

你可以在此處找到所有可用的性能提示:https://konvajs.org/docs/performance/All_Performance_Tips.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88436.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88436.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88436.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【LeetCode】209. 長度最小的子數組(前綴和 + 二分)

【LeetCode】209. 長度最小的子數組&#xff08;前綴和 二分&#xff09;題目描述前綴和二分優化前綴和總結二分總結題目描述 題目鏈接&#xff1a;【LeetCode】209. 長度最小的子數組&#xff08;前綴和 二分&#xff09; 給定一個含有 n 個整數的數組和一個整數 target。…

文件系統----底層架構

當我們談到文件系統的時候&#xff0c;最重要的點在于&#xff1a;文件的內容與屬性是如何存儲在磁盤中的&#xff1f;以及操作系統是如何精準定位到這些文件內容的&#xff1f;在談及文件的內核前&#xff0c;我們先來了解一下儲存文件的硬件-----硬盤一.理解硬件首先我們來看…

小程序開發平臺,自主開發小程序源碼系統,多端適配,帶完整的部署教程

溫馨提示&#xff1a;文末有資源獲取方式全開源與自主開發源碼完全開放&#xff1a;開發者可自由修改前端界面、后端邏輯及數據庫結構&#xff0c;支持深度定制&#xff08;如調整用戶端交互流程、商家端管理功能等&#xff09;。技術棧透明&#xff1a;基于主流技術&#xff0…

stp拓撲變化分類

Max Age 20sHellotime 2sForward delay 153、拓撲改變需要多長時間1&#xff09;根橋故障&#xff1a;需要50秒&#xff08;Max age2個forwarding delay&#xff09;2&#xff09;非直連鏈路&#xff1a;非直連故障在穩定的STP網絡&#xff0c;非根橋會定期收到來自根橋的BPDU報…

一、深度學習——神經網絡

一、神經網絡 1.神經網絡定義&#xff1a;人工神經網絡&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;也簡稱為神經網絡&#xff08;NN&#xff09;&#xff0c;是一種模仿生物神經網絡結構和功能的計算模型。人腦可以看作是一個生物神經網絡&#xff0c;由…

【牛客算法】 小紅的奇偶抽取

文章目錄 一、題目介紹1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 示例二、解題思路2.1 核心算法設計2.2 性能優化關鍵2.3 算法流程圖三、解法實現3.1 解法一:字符串分離法3.1.1 初級版本分析3.2 解法二:數學逐位構建法(推薦)3.2.1 優化版本分析四、總結與拓展4.1 關鍵優化技…

Maven 繼承:構建高效項目結構的利器

一、引言 Maven 是一個強大的項目管理工具&#xff0c;它通過標準化的項目結構和依賴管理極大地簡化了 Java 項目的開發流程。在 Maven 中&#xff0c;繼承是一種非常有用的功能&#xff0c;它允許我們創建一個父項目&#xff0c;其他子項目可以繼承這個父項目的配置信息&#…

Mysql組合索引的update在多種情況下的間隙鎖的范圍(簡單來說)

簡單來說&#xff0c;當 UPDATE 語句的 WHERE 條件使用了組合索引&#xff0c;并且需要鎖定不存在的“間隙”來防止幻讀時&#xff0c;就會產生間隙鎖。間隙鎖的范圍取決于 WHERE 條件如何利用組合索引&#xff0c;以及數據庫的隔離級別。 我們用圖書館的例子。比如&#xff1a…

什么是Apache Ignite的affinity(親和性)

在 Apache Ignite 中&#xff0c; affinity&#xff08;親和性&#xff09; 是一種用于控制數據分布和查詢性能的重要機制。它允許開發者指定數據如何在集群中的節點之間分布&#xff0c;從而優化數據訪問和查詢效率。以下是關于 affinity 的詳細解釋&#xff1a;數據親和性&a…

youtube圖論

dfs排序lifo & fifo存儲方式鄰接矩陣dijstra處理過的保存/更新&#xff0c;意味著一個節點避免了重復訪問bfs dfs

借助ssh實現web服務的安全驗證

背景 公有云服務器 http 服務 80端口&#xff0c;想做到安全訪問無須HTTPS 客戶端證書方便、快捷、安全 SSH 隧道 本地代理 使用 SSH 隧道將 HTTP 服務“隱藏”在 SSH 之后&#xff1a; # 客戶端建立隧道&#xff08;將本地 8080 轉發到服務器的 80 端口&#xff09; ssh…

狀態機在前端開發中的藝術:從理論到框架級實踐

文章目錄一 狀態機&#xff1a;復雜邏輯的終結者1.1 什么是狀態機&#xff1f;1.2 為何前端需要狀態機&#xff1f;二 狀態機核心概念深度解析2.1 有限狀態機&#xff08;FSM&#xff09;與分層狀態機&#xff08;HSM&#xff09;2.2 狀態機的數學表示三 前端開發中的狀態機實戰…

把word中表格轉成excle文件

把word中表格轉成excle文件 from docx import Document from openpyxl import Workbook from pathlib import Path# 打開 Word 文檔 document Document(./weather_report.docx) tables document.tables# 輸出文件路徑 output_file Path(./weather_report.xlsx)# 如果文件已存…

運維打鐵: 阿里云 ECS 實例的高效運維與管理

文章目錄思維導圖正文內容一、實例基礎管理1. 實例創建2. 實例配置調整3. 實例停止與啟動二、性能監控與優化1. 系統性能指標監控2. 磁盤 I/O 優化3. 網絡優化三、安全防護1. 防火墻設置2. 賬號安全管理3. 數據備份與恢復四、自動化運維1. 腳本自動化2. 使用云助手五、成本優化…

RV1126平臺(Buildroot Linux)+ SunplusIT SPCA2688 USB攝像頭 RTSP推流全流程復盤與問題解決記錄

# RK RV1126平臺&#xff08;Buildroot Linux&#xff09; SunplusIT SPCA2688 USB攝像頭 RTSP推流全流程復盤與問題解決記錄一、平臺與需求- **硬件平臺**&#xff1a;Rockchip RV1126 - **操作系統**&#xff1a;基于Buildroot定制的Linux系統 - **USB攝像頭**&#xff1a;Su…

深入理解Java虛擬機:Java內存區域與內存溢出異常

前言Java虛擬機&#xff08;JVM&#xff09;的自動內存管理是其核心特性之一&#xff0c;它極大地簡化了開發者的工作&#xff0c;減少了內存泄漏和內存溢出的問題。本文將詳細介紹JVM的自動內存管理機制的內存區域與內存溢出異常問題&#xff0c;包括運行時數據區域、對象的創…

位圖入門算法191. 位1的個數

題目鏈接&#xff1a; 191. 位1的個數 - 力扣&#xff08;LeetCode&#xff09; 這道題讓我們找出一個數字中二進制中1的個數&#xff0c;這個題目我們就用1的&來解決&#xff0c;最后一位有0為0&#xff0c;都是1才是1&#xff0c;我們只需要判斷32次即可。 代碼如下&am…

[架構之美]虛擬機Ubuntu密碼重置

[架構之美]虛擬機Ubuntu密碼重置 當您在虛擬機中運行Ubuntu系統時&#xff0c;忘記密碼不再意味著數據丟失&#xff01;本文將詳細介紹可靠的密碼重置方法&#xff0c;幫助您快速恢復系統訪問權限。 一、虛擬機密碼重置原理與準備 1.1 為什么虛擬機重置密碼更容易 在虛擬機環…

kotlin中withContext,async,launch幾種異步的區別

在 Kotlin 協程中&#xff0c;withContext、async 和 launch 是常用的異步/并發操作函數&#xff0c;它們的主要區別在于用途和返回值&#xff1a;1. launch 作用&#xff1a;啟動一個新的協程&#xff0c;用于執行不返回結果的并發任務。使用場景&#xff1a;適合執行沒有返回…

git 報錯fatal: refusing to merge unrelated histories

解決方案在你操作命令后面加--allow-unrelated-histories 例如&#xff1a; git merge master --allow-unrelated-historiesgit pull或者git push報fatal: refusing to merge unrelated histories 同理&#xff1a; git pull origin master --allow-unrelated-histories