Обрезка холста Сохранить и восстановить
У нас есть холст, который использует 5 областей отсечения (для вида спереди и сзади). Нам нужно сохранить весь холст в сеансе и восстановить его, когда пользователь вернется на страницу. Пока что мы не нашли способ сохранить состояние клипа и восстановить его. Ждем отзывов.
1 ответ
Вот схема того, как сохранить и восстановить области отсечения на холсте html.
Начните с этой схемы и напишите новый вопрос, если у вас возникнут проблемы с кодированием.
Обрезка холста HTML включает в себя:
Выполнение команд пути, которые определяют путь отсечения.
Делать клип с
context.clip()
Если требуется более одного клипа, вы должны обернуть каждый клип внутри
context.save
а такжеcontext.restore
пара.Связанные с преобразованием команды, которые могут быть использованы для создания клипов:
save, setTransform, transform, translate, rotate, scale, restore
Команды рисования пути, которые могут быть использованы для создания клипов:
beginPath, moveTo, arc, quadraticCurveTo, bezierCurveTo, lineTo, rect, arcTo, closePath
И команда, которая вызывает отсечение:
clip
Для сохранения и восстановления клипов необходимо сохранить, а затем повторно выполнить все контекстные команды, связанные с путем отсечения (и их аргументы).
Выполните оригинальные команды (с аргументами), которые создают пути отсечения.
Сохраните эти команды (и аргументы) в формате, который можно сериализовать и сохранить.
Вам решать, какой формат использовать для хранения команд. JSON - это распространенный формат, используемый для сохранения массивов JavaScript (например, команд и аргументов). Вы можете легко конвертировать JavaScript-массивы и объекты в строку, используя
JSON.stringify
,Вам решать, где будут храниться сериализованные команды. Общие места для хранения сериализованных команд: база данных, localStorage, состояние сеанса и т. Д.
Позже, когда пользователь переходит обратно на страницу, вы должны извлечь сохраненный JSON и "перегидрировать" команды (и аргументы), используя
JSON.parse
,Выполните сохраненные команды обтравочного контура (и аргументы) и вызовите
context.clip()
воссоздать ту же вырезку, что и изначально.
Рамки для этих задач могут включать создание PathObject
"учебный класс".
Это новый PathObject
класс должен уметь:
Принимает и сохраняет все оригинальные команды обтравочного контура (и аргументы).
Воспроизвести (повторно выполнить) сохраненные команды отсечения в контексте.
Сериализуйте свои сохраненные команды в JSON.
Примите строку JSON (содержащую сериализованные команды и аргументы) и восстановите состояние PathObject.
Еще раз введите команды обтравочного контура, необходимые для воссоздания тех же клипов, которые были изначально созданы.
PathObject
может содержать эти свойства и методы:
Свойства:
- команды [], arguments[], где каждая последовательно спаренная команда и аргумент являются одним шагом в создании обтравочного контура (см. выше, какие команды, связанные с путем, вы должны записать).
Методы:
PathObject
метод (функция), соответствующий каждой из команд пути. Каждая функция просто принимает аргументы, связанные с этой командой, и делаетcommands.push
а такжеarguments.push
для каждого из принятых аргументов.// when myPathObject.moveTo(x,y) is called... // store moveTo in the commands array commands.push('moveTo'); // store x,y (as an array) into the arguments array arguments.push([x,y]);
Метод для выполнения всех сохраненных команд пути в контексте.
for(var i=0;i<commands.length;i++){ context[commands[i]].apply(context, args[i]); }
Метод сериализации накопленных команд в строку JSON с использованием
var commandsAndArgs={ commands:commands, args:args } return(JSON.stringify(commandsAndArgs));
Метод десериализации строки JSON с использованием
var j=JSON.parse(json); this.commands=j.commands; this.args=j.args;