Я просматривал (все еще скудные) обсуждения и документацию famo.us в поисках того, что, как я надеялся, будет очевидным: анимация холста в CanvasSurface. Я действительно удивлен, что не нашел ни одного примера.
Я добился некоторого прогресса, поэтому я надеюсь, что этот пост поможет кому-то встать на ноги.
Вот мой голый код (ранее использовавший window.requestAnimationFrame
, но теперь скорректированный для расширения встроенного метода рендеринга), который в настоящее время работает, но я озадачен.
Мой вопрос следует за кодом:
define(function (require) {
"use strict";
var Engine = require('famous/core/Engine'),
View = require('famous/core/View'),
CanvasSurface = require('famous/surfaces/CanvasSurface'),
context = Engine.createContext(),
//
VividCanvas = function () {
var v = new View(),
cw = 320,
ch = 240,
c = 0,
surface = new CanvasSurface({size: [cw, ch]}),
ctxt = surface.getContext('2d'),
//
redraw = function () {
ctxt = surface.getContext('2d'); // WHY IS THIS LINE NECESSARY?
c += 1;
c = c % 360;
ctxt.fillStyle = "hsl(" + c + ", 100%" + ", 50%)";
ctxt.fillRect(0, 0, cw, ch);
window.requestAnimationFrame(redraw);
return surface.id; // i.e. a valid renderSpec
};
surface.render = redraw;
v.add(surface);
return v;
};
//
context.add(new VividCanvas());
});
Что меня озадачивает, так это то, что строка ctxt = surface.getContext('2d')
(первая строка в функции перерисовки) необходима. Я бы подумал, что ctxt уже определен и находится в области действия (см. непосредственно перед объявлением функции перерисовки).
Действительно, если вы зарегистрируете ctxt, вы получите контекст 2d Canvas в обоих случаях. Но по какой-то причине контекст холста, созданный в функции перерисовки, отличается от того, который был создан до первой перерисовки.
Это можно продемонстрировать, вставив console.log(ctxt === surface.getContext('2d'))
в качестве первой строки функции перерисовки (до переопределения ctxt). Он регистрирует ложь. Я не понимаю почему. Может кто-нибудь объяснить?
Если вы чувствуете, что ctxt должен указывать на правильную вещь и не нуждается в настройке, то этот второй вызов getContext должен быть ненужным. Однако, если я его опускаю, холст рисуется только один раз.
Так почему же?
Первоначально у меня был второй, но, возможно, связанный с ним вопрос о requestAnimationFrame. Из комментариев я смог заменить это строкой surface.render = redraw
и убедиться, что мой метод перерисовки возвращает идентификатор поверхности, что позволяет Famo.us обрабатывать синхронизацию анимации. Спасибо Андрею за его предложение в комментариях.
render
, в котором вы выполняете всю работу по обновлению. - person Andrew De Andrade   schedule 20.06.2014