Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.05.2011, 01:48
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

ExtCanvas - небольшой фреймворк
Давно уж хотел написать нечто подобное, потому как штатных средств для анимации и отлова событий у элемента HTML5 Canvas не предусмотрено.

Сразу предупреждаю - проект очень сырой, написан за два вечера на коленке.

Итак представляю вашему вниманию фреймворк (как звучит-то ) ExtCanvas, от словосочетания Extended Canvas.

Что он умеет:
  • работать с фигурами как с объектами;
  • анимировать любые числовые параметры фигур, такие как координаты, размеры и т. п. (анимация CSS-цветов в разработке);
  • изменять параметры фигур без анимации;
  • обрабатывать события мыши для каждой фигуры в отдельности.
Что он не умеет:
  • обработчик событий не работает если фигура была нарисована не способом "beginPath - рисуем - closePath" (надеюсь в будущих выпусках спецификации это исправят).

Фреймворк работает полностью автономно, то есть не нужно никаких дополнительных библиотек, что в сумме с очень маленьким размером (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('Клацнули мышкой');

});

Обработчики суммируются, то есть будут выполняться в порядке их установления (нужно будет, кстати, сделать возможность удаления обработчиков).

Сейчас фреймворк обрабатывает такие события:
  • mousemove
  • mouseover
  • mouseout
  • mousedown
  • mouseup
  • mouseclick
Посмотреть исходник с простенькой демонстрашкой можно тут. С красотами не заморачивался, нарисовал пару примитивов чтоб что-то мельтешило, фигурки можно таскать мышкой.

Программированием занимаюсь менее года, поэтому сильно не пинать. А вообще рад буду выслушать конструктивную критику и рекомендации.

Последний раз редактировалось DreamTheater, 01.06.2011 в 01:10.
Ответить с цитированием
  #2 (permalink)  
Старый 05.06.2011, 17:40
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

И тишина...
Ответить с цитированием
  #3 (permalink)  
Старый 05.06.2011, 18:52
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от DreamTheater
И тишина...
книга по канве . издательство орели-600 страниц. комментарии излишни. сделай с учётом всего-тогда обсудим. а сейчас нет смысла...
Ответить с цитированием
  #4 (permalink)  
Старый 05.06.2011, 21:49
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

А как она точно называется?
Ответить с цитированием
  #5 (permalink)  
Старый 06.06.2011, 10:44
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Автор: Steve Fulton, Jeff Fulton
Название: HTML5 Canvas
Издательство: O'Reilly
Год: 2011

http://mirknig.com/knigi/web/1181403...l5-canvas.html

Последний раз редактировалось dmitriymar, 06.06.2011 в 11:04.
Ответить с цитированием
  #6 (permalink)  
Старый 15.06.2011, 14:48
Интересующийся
Отправить личное сообщение для Micky_Holtern Посмотреть профиль Найти все сообщения от Micky_Holtern
 
Регистрация: 21.03.2010
Сообщений: 11

А почему решили писать свой фрэймворк, ведь есть jCanvaScript и libCanvas, например?
Ответить с цитированием
  #7 (permalink)  
Старый 15.06.2011, 15:06
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

jCanvaScript не понравился, к сожалению уже не помню почему, а LibCanvas не ловит события мыши для отдельных фигурок.
Ответить с цитированием
  #8 (permalink)  
Старый 24.06.2011, 23:06
Интересующийся
Отправить личное сообщение для Shock Посмотреть профиль Найти все сообщения от Shock
 
Регистрация: 16.01.2009
Сообщений: 20

Цитата:
а LibCanvas не ловит события мыши для отдельных фигурок.
Что? О чём вы?
Ответить с цитированием
  #9 (permalink)  
Старый 24.06.2011, 23:16
Аватар для DNemo
Новичок на форуме
Отправить личное сообщение для DNemo Посмотреть профиль Найти все сообщения от DNemo
 
Регистрация: 24.06.2011
Сообщений: 4

Хм... значит то я так читал. А Вы тот самый Shock? Оо
Ответить с цитированием
  #10 (permalink)  
Старый 24.06.2011, 23:21
Интересующийся
Отправить личное сообщение для Shock Посмотреть профиль Найти все сообщения от Shock
 
Регистрация: 16.01.2009
Сообщений: 20

Код, кстати, на удивление хорош. Конечно, есть некоторые ошибки, кое-где видны не очень хорошие знания 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);
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск