Konva 是一個 基於 Canvas 開發的 2d js 框架庫, 它能夠輕鬆的實現桌面應用和移動應用中的圖形交互交互效果.node
Konva 能夠高效的實現動畫, 變換, 節點嵌套, 局部操做, 濾鏡, 緩存, 事件等功能, 不單單適用於桌面與移動開發, 還有更爲普遍的應用.git
Konva 容許在舞臺上繪圖, 添加事件監聽, 移動或縮放某個圖形, 獨立旋轉, 以及高效的動畫. 即便應用中含有數千個圖形也是能夠輕鬆實現的.github
任何圖形都存在於舞臺中( Konva.Stage ). 這個舞臺中又能夠包多個用戶層( Konva.Layer ).json
每個層中都含有兩個 <canvas> 着色器: 一個前臺渲染器, 一個後臺渲染器. 前臺渲染器是能夠看見的部分, 然後臺渲染器是一個隱藏的 canvas. 後臺渲染器爲了提升效率實現事件監聽的工做.canvas
每個層能夠包含形狀( Shape ), 形狀的組( Group ), 甚至是由組組成的組. 舞臺, 層, 組, 以及形狀都是虛擬的節點( node ). 相似於 HTML 頁面中的 DOM 節點.緩存
例如:服務器
在這個圖形中, 首先有一個舞臺( Stage ). 該舞臺在頁面中與整個頁面的大小同樣. 而後舞臺中有一個層( Layer ). 層中有一個矩形( Rect )和一個圓形( Circle ). 所以就有一個樹結構:框架
全部的節點均可以設置樣式與變化. 即便 Konva 能夠從新渲染形狀, 例如: 矩形, 圓形, 圖片, 精靈, 文本, 線段, 多邊形, 正多邊形, 路徑, 和星星等. 可是開發者依舊能夠根據 Shape 類的模板自定義本身的圖形, 而後重寫 draw
方法.ide
只要擁有了 舞臺( Stage ), 而且上面放置了層( Layer )和圖形( Shape ), 那麼就能夠爲他添加事件監聽, 變換節點, 運行動畫, 使用路徑, 甚至是更多的效果.函數
例如要實現上面的案例:
<script src="konva.js"></script>
<div id="dv"></div>
var stage = new Konva.Stage({ container: 'dv', width: window.innerWidth, height: window.innerHeight });
var layer = new Konva.Layer();
stage.add( layer );
var rect = new Konva.Rect({ x: 100, y: 50, width: 200, height: 100, fill: 'red' });
layer.add( rect );
var circle = new Konva.Circle({ x: stage.getWidth() / 2, y: stage.getHeight() / 2, radius: 100, fill: 'pink', stroke: 'blue' }); layer.add( circle );
layer.draw();
Konva.js 支持的形狀有: 矩形( Rect ), 圓形( Circle ), 橢圓( Rllipse ), 線段( Line ), 圖像( Image ), 文本( Text ), 文本路徑( TextPath ), 星星( Start ), 標籤( Label ), SVG 路徑( SVG Path ), 正多邊形( RegularPolygon ). 同時也能夠自定義形狀.
var triangle = new Konva.Shape({ sceneFunc: function ( ctx ) { // 自定義繪圖路徑
ctx.moveTo( window.innerWidth / 2, window.innerHeight / 4 ); ctx.lineTo( window.innerWidth / 2 - window.innerHeight / ( 2 * 1.732 ), window.innerHeight * 3 / 4 ); ctx.lineTo( window.innerWidth / 2 + window.innerHeight / ( 2 * 1.732 ), window.innerHeight * 3 / 4 ); ctx.closePath(); // Konva.js 的獨有方法
ctx.fillStrokeShape( this ); }, fill: 'pink', stroke: 'red' });
layer.add( triangle );
layer.draw();
效果:
全部的形狀都支持下列樣式屬性:
構造函數: Konva.RegularPolygon( options )
經常使用屬性:
案例
var shape = new Konva.RegularPolygon({ x: stage.getWidth() / 2, y: stage.getHeight() / 2, sides: 5, radius: 70, fill: 'red', stroke: 'black', strokeWidth: 4, shadowOffsetX: 20, shadowOffsetY: 25, shadowBlurBlur: 40, opacity: 0.5 }); layer.add( shape );
效果
使用 Konva 能夠輕鬆的實現監聽用戶添加的事件. 例如 click, dblclick, mouseover, tap, dbltap, touchstart 等. 屬性值變化事件. 例如 scaleXChange, fillChange 等. 以及拖拽事件. 例如 dragstart, dragmove, dragend.
circle.on( 'mouseout touchend', function () { console.log( '用戶輸入' ); }); circle.on( 'xChange', function () { console.log( '位置發生改變' ); }); circle.on( 'dragend', function () { console.log( '拖動中止' ); });
Konva 支持拖拽的功能. 也支持降低事件( drop, dropenter, dropleave, dropover ).
若是須要實現拖拽的功能. 能夠設置 draggable 屬性爲 true.
Konva 還支持給拖拽事件添加移動範圍.
Konva 中可使用兩種方式建立動畫
var anim = new Konva.Animation(function ( frame ) { var time = frame.time, timeDiff = frame.timeDiff, frameRate = frame.frameRate; // 更新代碼
}, layer );
2.使用 Konva.Tween
var tween = new Konva.Tween({ node: rect, duration: 1, x: 140, rotation: Math.PI * 2, opacity: 1, strokeWidth: 6 }); // 或者使用新的短方法
circle.to({ duration: 1, fill: 'green' });
當構建規模較大的應用時, 若是能夠對元素進行搜索是很是方便的. Konva 使用選擇器來實現元素的查找. 使用 find() 方法返回一個集合. 使用 findOne() 方法返回集合中的第 0 個元素.
全部被建立的對象均可以保存爲 JSON 對象. 能夠在服務器或本地存儲中使用它.
var json = stage.toJSON();
同時, 也能夠從 JSON 中恢復 Konva 對象.
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');