Paper.js предоставляет мощный объект Tool, позволяющий создавать собственные инструменты для рисования, обработки событий мыши и клавиатуры. Кастомные инструменты особенно полезны для реализации интерактивных приложений, редакторов графики и анимаций.
Для начала создаётся новый объект Tool:
var myTool = new Tool();
Каждый инструмент может иметь свои обработчики событий, которые реагируют на действия пользователя:
onMouseDown(event) — срабатывает при нажатии кнопки
мыши.onMouseDrag(event) — срабатывает при перемещении мыши с
зажатой кнопкой.onMouseUp(event) — срабатывает при отпускании кнопки
мыши.onKeyDown(event) — срабатывает при нажатии клавиши на
клавиатуре.onKeyUp(event) — срабатывает при отпускании клавиши на
клавиатуре.Пример базового инструмента, рисующего линии при перетаскивании мыши:
var path;
myTool.onMouseD own = function(event) {
path = new Path();
path.strokeColor = 'black';
path.add(event.point);
};
myTool.onMouseD rag = function(event) {
path.add(event.point);
};
myTool.onMous eUp = function(event) {
path.simplify();
};
Особенности:
event.point возвращает точку в координатах
Paper.js.Path автоматически создаёт новый объект кривой или
линии.simplify() уменьшает количество сегментов без
потери визуального качества.Инструменты могут иметь собственные состояния, позволяющие создавать многофункциональные кисти:
var toolMode = 'pen'; // или 'eraser'
var path;
myTool.onMouseD own = function(event) {
if (toolMode === 'pen') {
path = new Path();
path.strokeColor = 'blue';
path.add(event.point);
} else if (toolMode === 'eraser') {
var hitResult = project.hitTest(event.point, { fill: true, stroke: true });
if (hitResult) hitResult.item.remove();
}
};
myTool.onMouseD rag = function(event) {
if (toolMode === 'pen') {
path.add(event.point);
}
};
Ключевые моменты:
project.hitTest(point, options) позволяет определить
объект под курсором.Можно создавать кисти, которые изменяют свой вид в зависимости от скорости движения мыши, давления или угла:
var brush = new Tool();
var path;
brush.onMouseD own = function(event) {
path = new Path();
path.strokeColor = 'red';
};
brush.onMouseD rag = function(event) {
var speed = event.delta.length;
path.strokeWidth = Math.min(speed, 10); // толщина зависит от скорости
path.add(event.point);
};
Пояснение:
event.delta — вектор перемещения мыши с предыдущего
события.strokeWidth создаёт эффект динамичной линии,
реагирующей на движение.В Paper.js можно иметь несколько инструментов одновременно, активируя
нужный через activate():
var penTool = new Tool();
var eraserTool = new Tool();
penTool.onMouseD rag = function(event) {
var path = new Path();
path.strokeColor = 'green';
path.add(event.point);
};
eraserTool.onMouseD rag = function(event) {
var hitResult = project.hitTest(event.point, { fill: true, stroke: true });
if (hitResult) hitResult.item.remove();
};
// активация нужного инструмента
penTool.activate();
Особенности:
Инструменты Paper.js позволяют реагировать на клавиши, расширяя функциональность:
var keyTool = new Tool();
var path;
keyTool.onKeyD own = function(event) {
if (event.key === 'z') {
project.activeLayer.removeChildren(); // очистка слоя
}
};
keyTool.onMouseD own = function(event) {
path = new Path.Circle({
center: event.point,
radius: 20,
fillColor: 'orange'
});
};
Важно:
event.key возвращает имя клавиши в виде строки.Инструменты для рисования кривых Безье
Segment и handleIn /
handleOut для плавных кривых.Инструменты выделения и перемещения объектов
project.hitTest для выбора объектов.item.position += event.delta для перетаскивания.Инструменты с визуальной подсказкой
Path или Raster
объектов для отображения формы до фиксации.Пример инструмента выделения и перемещения:
var moveTool = new Tool();
var selected;
moveTool.onMouseD own = function(event) {
var hit = project.hitTest(event.point, { fill: true, stroke: true });
if (hit) selected = hit.item;
};
moveTool.onMouseD rag = function(event) {
if (selected) selected.position += event.delta;
};
moveTool.onMous eUp = function(event) {
selected = null;
};
event.delta,
event.point и event.count для интерактивного
эффекта.Эти возможности позволяют создавать в Paper.js практически любые интерактивные редакторы и визуальные эффекты, от простых кистей до сложных редакторов векторной графики.