|
ExtCanvas - небольшой фреймворк
Давно уж хотел написать нечто подобное, потому как штатных средств для анимации и отлова событий у элемента HTML5 Canvas не предусмотрено.
Сразу предупреждаю - проект очень сырой, написан за два вечера на коленке. Итак представляю вашему вниманию фреймворк (как звучит-то :D ) ExtCanvas, от словосочетания Extended Canvas. Что он умеет:
Фреймворк работает полностью автономно, то есть не нужно никаких дополнительных библиотек, что в сумме с очень маленьким размером (14 кб в несжатом виде) делает его загрузку моментальной. Инициализируется вот так: var canvas = document.getElementById('canvasId'); var extcanvas = new ExtCanvas(canvas); В качестве аргумента конструктору можно передавать элемент, контекст или просто ID элемента (хотя в идеале я хочу сделать выбор по CSS селектору как в jQuery), инициализация нативная. Рисуются фигуры вот так: var circle = extcanvas.addShape(function(x, y, radius) { // Эта функция выполняется в контексте CanvasRenderingContext2D, поэтому можно использовать this для рисования this.beginPath(); this.arc(x, y, radius, 0, Math.PI * 2, false); this.closePath(); this.fillStyle = '#F00'; this.fill(); }, { // Эти параметры будут переданы как аргументы в предыдущую функцию // Если параметр не задекларирован здесь, то он не сможет принимать участие в анимации x: 100, y: 100, radius: 50 }); Для того чтобы изменить один или несколько параметров нужно написать: circle.set({ x: 150, y: 150 }); После этого окружность поменяет свои координаты. Те параметры, которые не были указаны, останутся без изменений. Для того чтобы создать анимацию, например, плавного увеличения окружности в течение 500 мс, пишем вот так: circle.animate({ radius: 75 }, 500, function() { // Здесь можно написать функцию обратного вызова }); Устанавливать обработчики событий можно двумя способами - аля jQuery и в стиле стандартного addEventListener: circle.hover(function() { alert('Навели мышку.'); }, function() { alert('Отвели мышку.'); }); circle.addEventListener('mouseclick', function(event) { // Переменная event содержит в себе текущие координаты курсора, на каком объекте он расположен и т. п. alert('Клацнули мышкой'); }); Обработчики суммируются, то есть будут выполняться в порядке их установления (нужно будет, кстати, сделать возможность удаления обработчиков). Сейчас фреймворк обрабатывает такие события:
Программированием занимаюсь менее года, поэтому сильно не пинать. А вообще рад буду выслушать конструктивную критику и рекомендации. |
И тишина... :(
|
Цитата:
|
А как она точно называется?
|
Автор: Steve Fulton, Jeff Fulton
Название: HTML5 Canvas Издательство: O'Reilly Год: 2011 http://mirknig.com/knigi/web/1181403...l5-canvas.html |
А почему решили писать свой фрэймворк, ведь есть jCanvaScript и libCanvas, например?
|
jCanvaScript не понравился, к сожалению уже не помню почему, а LibCanvas не ловит события мыши для отдельных фигурок.
|
Цитата:
|
Хм... значит то я так читал. А Вы тот самый Shock? Оо
|
Код, кстати, на удивление хорош. Конечно, есть некоторые ошибки, кое-где видны не очень хорошие знания JavaScript, но в общем - код на редкость качественный
Например: this.setListener = function(type, listener) { switch (type) { case 'mouseover': this.mouseover.set(listener); break; case 'mouseout': this.mouseout.set(listener); break; case 'mousemove': this.mousemove.set(listener); break; case 'mousedown': this.mousedown.set(listener); break; case 'mouseup': this.mouseup.set(listener); break; case 'mouseclick': this.mouseclick.set(listener); break; } } Вполне можно заменить на: this.setListener = function(type, listener) { if ( ['mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'mouseclick'].indexOf(type) === -1 ) return; this[type].set(listener); } |
Часовой пояс GMT +3, время: 02:38. |
|