Fabric.jsでcanvasの図形のグループ化や解除をする

公開:
HTML5のcanvasでJavaScriptライブラリのFabric.jsを使用し、図形など要素(オブジェクト)を、グループ化及びグループ解除する方法です。複数の図形を1つの図形のように扱えます。
オブジェクト名で指定した要素の場合、ユーザーが選択した要素の場合、の2通りで説明しています。
オブジェクト名で指定した要素のグループ化と解除
グループ化
家を、移動/拡縮/回転させると、家ごと操作できます。
var canvas = new fabric.Canvas('cvs'); var roof = new fabric.Triangle({ width: 160, height: 40, fill: 'red' }); var wall = new fabric.Rect({ left: 20, top: 40, width: 120, height: 80, fill: 'olive' }); var window = new fabric.Rect({ left: 40, top: 60, width: 40, height: 30, fill: 'aqua' }); var house = new fabric.Group([roof, wall, window], { left: 70, top: 80 }); canvas.add(house);
屋根(roof)、壁(wall)、窓(window)それぞれの left / top 座標は基準点(0, 0)からの座標です。それらをfabric.Groupでグループ化し、黒い点の位置(70, 80)に配置しています。
グループ解除
次のボタンを押すと上記の家の屋根などが分解されます。
house.toActiveSelection(); canvas.requestRenderAll();
目的要素(この場合は"house")にtoActiveSelection()で、それがグループ解除されます。
ユーザーが選択した要素のグループ化と解除
グループ化
すでにある要素をユーザーが複数選択し、それをグループ化させます。
2つ選択してグループ化し、それと更にもう1つを選択して更にグループ化もできます。また、グループとグループを更にグループ化もできます。
それを解除すると、事前にグループ化したものはグループ状態が保持されています。更にそのグループを解除すると全て単独要素に分解できます。
つまり、グループ化のネスト(入れ子状態=多重化)も可能です。
if (! canvas.getActiveObject()) { return; } if (canvas.getActiveObject().type !== 'activeSelection') { return; } canvas.getActiveObject().toGroup(); canvas.requestRenderAll();
行と説明
- 1,2
- 何も選択されていない場合や、グループ以外の要素が選択されている場合に備えて、エラー対策です。
- 4
- getActiveObject()で選択要素を取得し、toGroup()でグループ化します。
グループ解除
if (! canvas.getActiveObject()) { return; } if (canvas.getActiveObject().type !== 'group') { return; } canvas.getActiveObject().toActiveSelection(); canvas.requestRenderAll();
getActiveObject()で選択要素を取得し、toActiveSelection()で解除されます。
グループ化のまとめ
このように、複数の基本図形をグループ化することで多様な図形を簡単に扱えるようになります。
最初からグループ化して配置することも、ユーザー操作を元にグループ化することも可能です。