Paper.js предоставляет мощный механизм работы с
инструментами, позволяющий обрабатывать события мыши и
клавиатуры, создавать интерактивные рисунки и настраивать
пользовательский ввод. Основной объект для работы с инструментами —
Tool. Каждый инструмент имеет собственное состояние,
включая активность, курсор и набор обработчиков событий.
Инструмент создается с помощью конструктора
new Tool():
var myTool = new Tool();
Активировать инструмент можно через метод:
myTool.activate();
Активный инструмент получает все события ввода, такие как движение мыши, нажатия и отпускания кнопок. Важно: в Paper.js одновременно может быть активен только один инструмент. При активации нового инструмента предыдущий автоматически деактивируется.
tool.active — булево значение, определяющее, является
ли инструмент активным.tool.minDistance — минимальное расстояние (в пикселях)
между событиями onMouseDrag. Полезно для снижения
количества вызовов при быстрых перемещениях мыши.tool.maxDistance — максимальное расстояние между
событиями onMouseDrag. Используется для контроля
интерполяции при рисовании.tool.fixedDistance — если установлено, события
onMouseDrag будут вызываться с постоянным шагом вне
зависимости от реального движения мыши.Пример настройки инструмента для рисования с шагом:
var drawTool = new Tool();
drawTool.minDistance = 5;
drawTool.maxDistance = 20;
Инструменты Paper.js используют систему событий, которая позволяет реагировать на действия пользователя. Основные обработчики:
Срабатывает при нажатии кнопки мыши.
myTool.onMouseD own = function(event) {
console.log('Нажата кнопка мыши в точке:', event.point);
};
Срабатывает при перетаскивании мыши с зажатой кнопкой. Доступны такие свойства события, как:
event.point — текущая позиция мыши.event.delta — вектор движения мыши с предыдущего
события.event.lastPoint — предыдущая позиция мыши.Пример рисования линии:
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();
};
Реагирует на движение мыши без зажатых кнопок. Полезно для интерактивных эффектов, например, изменения курсора или предварительного просмотра:
myTool.onMouseM ove = function(event) {
console.log('Курсор на:', event.point);
};
Позволяют реагировать на клавиатурные события. event.key
содержит символ нажатой клавиши.
myTool.onKeyD own = function(event) {
if (event.key === 'delete') {
project.activeLayer.removeChildren();
}
};
Paper.js позволяет хранить несколько инструментов и переключаться между ними динамически. Например, для реализации разных режимов рисования:
var drawTool = new Tool();
var eraseTool = new Tool();
drawTool.onMouseD rag = function(event) { /* рисование */ };
eraseTool.onMouseD rag = function(event) { /* стирание */ };
function switchTool(toolName) {
if (toolName === 'draw') drawTool.activate();
else if (toolName === 'erase') eraseTool.activate();
}
Состояние инструмента сохраняется, поэтому при возврате к нему все
настройки (minDistance, maxDistance) и
обработчики остаются в силе.
Инструменты могут содержать собственные пользовательские свойства, что позволяет хранить состояние между событиями:
var lineTool = new Tool();
lineTool.currentPath = null;
lineTool.onMouseD own = function(event) {
this.currentPath = new Path();
this.currentPath.strokeColor = 'blue';
this.currentPath.add(event.point);
};
lineTool.onMouseD rag = function(event) {
this.currentPath.add(event.point);
};
Такой подход позволяет сделать инструмент самодостаточным, без зависимости от внешних переменных.
onMouseDrag могут вызываться очень часто при
быстром движении мыши. Настройка minDistance и
maxDistance помогает снизить нагрузку.tool.active = false) полностью
отключает обработку всех событий и экономит ресурсы.Инструменты работают только внутри контекста
PaperScope, что позволяет использовать
несколько независимых проектов на одной странице:
var scope1 = new PaperScope();
scope1.setup('canvas1');
var scope2 = new PaperScope();
scope2.setup('canvas2');
var tool1 = new scope1.Tool();
var tool2 = new scope2.Tool();
Каждый инструмент будет реагировать только на события в своем
scope и не будет конфликтовать с другими.
Использование инструментов в Paper.js обеспечивает гибкое
управление интерактивными действиями, возможность хранения
состояния между событиями и поддержку сложных сценариев с множеством
режимов взаимодействия. Применение Tool позволяет создавать
как простые кисти для рисования, так и полноценные редакторы с
различными инструментами и клавиатурными комбинациями.