1

famo.us では、サーフェス上で修飾子を使用してアニメーション/インタラクションを実行する簡単な方法がいくつかあります。たとえば、サーフェスのドラッグとアニメーション化については、famo.us ガイドに非常にわかりやすい例があります。

...assume require('') statements above here...

var mainContext = Engine.createContext();
var draggable = new Draggable({...});
var surface = new Surface({...});
var transitionableTransform = new TransitionableTransform();
var modifier = new Modifier({
  origin: [.5, .5],
  transform: transitionableTransform
});
surface.pipe(draggable);
surface.on('click', function () {
  transitionableTransform.setScale([3, 3, 1], {duration: 300});
});
mainContext.add(draggable).add(surface);

ただし、より複雑なシナリオでは、インタラクションに応じて必要に応じて開始/停止/反転して、複数のアニメーションを調整したい場合があります。そのような場合、期間を指定して変換を追加するだけの簡単な方法が最初は機能する可能性がありますが、ユーザーがそれらを操作するほど同期が失われないという保証はありません。

#render メソッドは、いくつかの種類の調整されたアニメーションを配置する一般的な場所のようです。それについての私の限られた理解は、レンダリングされているノードの「仕様」を識別し、レンダリングループの各フレームで呼び出されるということです。したがって、特定のアニメーションの各ステップを識別し、それがどのように相互作用するかに応じて、アニメーションの途中で停止し、必要に応じて変更できる場合があります。たとえば、フリッパーはこのように動作するようです

(src/views/Flipper.js):

Flipper.prototype.render = function render() {
  var pos = this.state.get(); //state is a transitionable
  var axis = this.options.direction;
  var frontRotation = [0, 0, 0];
  var backRotation = [0, 0, 0];
  frontRotation[axis] = Math.PI * pos;
  backRotation[axis] = Math.PI * (pos + 1);

  if (this.options.cull && !this.state.isActive()) {
      if (pos) return this.backNode.render();
      else return this.frontNode.render();
  }
  else {
      return [
          {
              transform: Transform.rotate.apply(null, frontRotation),
              target: this.frontNode.render()
          },
          {
              transform: Transform.rotate.apply(null, backRotation),
              target: this.backNode.render()
          }
      ];
  }
};

アニメーション時に #render が果たすべき役割に関するドキュメントはありますか? または、render メソッドがどのように正確に機能するか (たとえば、返される仕様を構築する正しい方法)。render はより低レベルであると想定されていますか? もしそうなら、別の構造を使用する必要がありますか?

4

2 に答える 2

0

レンダリングされたノードを制御したい場合はViewrender関数を使用してカスタムを記述します。Flipperクラスは単純な例です (そしてはRenderControllerこのパターンの複雑な例です)

Famo.us のレンダリング方法:

  1. EveryRenderNodeにはrenderを作成する関数があります renderSpec
  2. にはまたは renderSpecに関する情報が含まれています。 2.1仕様は、最終特性の計算に使用されます。 2.2仕様は要素に結合されています。ModifierSurface
    ModifierCSS
    SurfaceDOM

  3. の各ティックはEngine、関数renderSpecを使用してレンダリングされRenderNode.commitます。

  4. このcommit関数はElementAllocator(からのContext) を使用して、DOM 要素の割り当て/割り当て解除を行います。(これは実際にはメモリを節約するために DOM ノードをリサイクルします)。したがってrenderSpec、 customViewで正しいものを返すだけで、 famo.us がメモリとパフォーマンスを管理します。

ノート:

クラスを使用する必要はありません。関数をView持つオブジェクトでrender十分です。このViewクラスはイベントとオプションを追加するだけで、カプセル化された再利用可能なコンポーネントを作成するのに適した方法です。

Surface要素が DOM に割り当てられると、イベントdeployが発生します。

Surface要素の割り当てが解除されると、イベントrecallが発生します。

http://famousco.de/2014/07/look-inside-rendering/からのコピー

于 2014-10-23T09:10:00.070 に答える