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); } |
Да, тот самый =)
|
Ваша функция toArray имеет ряд недостатков. Как по скорости, так и по логике. Лучше использовать что-то типа такого:
var toArray = function(o) { return Array.prototype.slice.call(o); } |
Цитата:
Цитата:
Цитата:
Цитата:
|
Чего охренеть?
Я Вам вот что советую - не стоит распылять силы OS сообщества - лучше присоединяйтесь к LibCanvas ;) |
Ну как что, Вы, можно сказать, великий Гуру для меня :thanks:
С удовольствием присоединюсь, все никак руки не дойдут разобраться с AtomJS. |
Пишите в Jabber shock@jabber.com.ua , пообщаемся)
|
Shock,
вы под IE не пишите, как я понимаю? :) Цитата:
Цитата:
|
Зачем в Canvas-фреймворке костыли для IE, если даже с ними там ничего не заработает?
|
Цитата:
|
Ну почему же, в IE9 все замечательно работает, причем даже быстрее чем в других браузерах.
|
Цитата:
['mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'click'].join().search('mousemove') === -1; //либо так: 'mouseover, mouseout, mousemove, mousedown, mouseup, click'.search('mousemove') === -1; для тех, кто не знает как реализовать Array.indexOf(): (function($) { if(!$.indexOf) { $.indexOf = function(object) { var length = this.length -1, i = 0; while(++i <= length) { if(i in this && this[i] === object) { return i; } } return -1; }; } })(Array.prototype); Shock, у вас все проекты ориентированные на IE9+? DNemo/DreamTheater, что за событие mouseclick? |
Цитата:
|
Цитата:
|
Цитата:
1. по прежнему lastIndexOf. 2. возможен бесконечный цикл (если массив пустой). 3. никогда не находит совпадение в последнем элементе ( alert([2, 1].indexOf(1));// -1 ). Без поддержки второго аргумента (from) у меня получается так: if (!('indexOf' in arrayProto)) { arrayProto.indexOf = function(item) { for (var i = 0, l = this.length; i < l; i++) { if (this[i] === item) return i; } return -1; }; } |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
(function($) { if(!$.indexOf) { $.indexOf = function(object) { var length = this.length, i = arguments[1] || 0; i = Math[i < 0 ? 'ceil' : 'floor'](i) - 1; //для отрицательных индексов if(i < 0) i += length; while(++i <= length) { if(i in this && this[i] === object) { return i; } } return -1; }; } })(Array.prototype); |
Цитата:
|
PS. MooTools indexOf
|
Цитата:
Цитата:
Цитата:
|
Вы сейчас рассуждаете как программисты, и я с вами полностью согласен - IE это жуткий геморрой на задницу разработчика, но тем не менее это один из популярнейших браузеров в мире. Большинство рядовых пользователей вообще не знает о том что такое браузер и, тем более, чем разные браузеры отличаются, они пользуются тем что предустановлено в их любимой Windows. Поэтому отказ от поддержки IE это потеря огромной части целевой аудитории, а значит и денег заказчика.
|
DreamTheater, остановившись на Canvas вы УЖЕ отказались от Internet Explorer 8-
Цитата:
|
Часовой пояс GMT +3, время: 17:58. |