开源跨平台移动项目Ngui【Action动做系统】

Ngui简介

这是一个GUI的排版显示引擎和跨平台的GUI应用程序开发框架,基于NodeJS/OpenGL,这也是第一个在移动端Android/iOS融合NodeJS的前端GUI项目,至此JavaScript成为了真正意义上先后端通吃的语言。html

Ngui的目标:在此基础上开发GUI应用程序可拥有开发WEB应用般简单与速度同时兼顾Native应用程序的性能与体验。前端

什么是Action动做

什么是动做呢?顾名思义它是管理运行环境中全部动做的中枢,通俗点讲就是动画。它也是总个框架核心组件之一,它提供动做的建立、删除、插入,以及提供对关键帧与过渡的诸多操做。关键帧的过渡能够使用三次贝塞尔曲线,或内置的曲线 linear/ease/ease_in/ease_out/ease_in_out,这也和大多数主流框架以及游戏引擎相似。并发

动做是什么原理

动做怎么驱动视图进行流畅运动的呢?其实原理很简单,咱们能够把动做系统看作一个独立的系统与视图或渲染彻底不相关。它们之间的关系是动做自身的变化最终会映射调视图,这个过程是经过调用视图暴露的公有方法或属性来完成的。这个过程彻底是单向的,且视图不会向动做发出任何指令。
好比说如今建立了一个新的关键帧动做,给它设置两个关键帧,且x的值通过1秒钟从0变化到100。这个过程是动做自身发生的变化而且带动与之相关的视图一同发生改变,请记住这个过程视图是被动的,而动做才是主动的发生改变。app

import { ngui, Div } from 'ngui';
import KeyframeAction from 'ngui/action';
var div = new Div();
var act = new KeyframeAction();
act.add({ x: 0, time: 0 });
act.add({ x: 100, time: 1e3/*毫秒*/ });
div.width = 50;
div.height = 50;
div.backgroundColor = '#f00';
div.action = act;
div.appendTo(ngui.root);
act.play();

动做类别

如下是框架提供的几个类型与继承联系框架

注:带*号的为抽象类型或协议没有构造函数

Action*

这是全部动做的基础类型,也是抽象类型不能够直接被实例。
提供了一些基本的api操做,播放中止跳转 等,具体可查看API手册。

GroupAction*

这是个集合的动做类型,提供子动做的添加删除插入。有了子动做就能够帮你实现更加复杂的动画场景。
它也有两个具体的子类型 SpawnActionSequenceAction

SpawnAction

并行动做顾名思义即就是它的子动做都是并行运行的。而且以最长子动做的时长作为自身的时长来执行动做,较短时长的子动做则在结尾等待动做的结束或一个循环的的终止。

SequenceAction

串行动做这个比较好理解,子动做一个接着一个执行,所有执行完成后结束或开始新的循环。

KeyframeAction与Frame

关键帧动做这是动做系统的核心。全部动做的实现均在这里完成它是动做系统基本单元,前面的GroupAction只有包含KeyframeAction类型的动做才有真正的义意。
而关键帧动做又包含理更加基本的元素关键帧Frame,关键帧包含的属性与CSS属性是同名的且与全部视图的属性都是对应关键。通俗的说好比View上会有x属性而Frame上也会有x属性,若是关键帧上有视图上并不存在的属性,那么这个属性对视图是无效的。好比View上就不存在width属性那么这个属性的改变不会影响到View,但若是绑定的视图是Div那么width的改变必定会影响到它,这与CSS样式表相似。

看下面的例子:

// 这是有效的动做
var act1 = new KeyframeAction();
var div = new Div();
div.backgroundColor = '#f00';
act1.add({ width: 10, height: 10 });
act1.add({ width: 100, height: 100, time: 1e3 });
div.action = act1;
act1.paly();
// 这是无效的
var act2 = new KeyframeAction();
var view = new View();
act2.add({ width: 10, height: 10 });
act2.add({ width: 100, height: 100, time: 1e3 });
view.action = act2;
act2.paly();

View.action属性

View.action作为View的一个属性可接收多种类型的参数,以前给你们展现的例子中建立动做是很繁琐的,但active提供多种类型的参数类型的支持,包括json数据与Action对像实例自己。前面的例子中已介绍过Action方式,下面着重说json数据方法。你们也可研读ngui.jsaction.js中的源代码,其它View.action属性只是作简单的调用转发,功能的实现实际上是在action.js文件中的create()方法里实现的。

看例子:

// 这是建立KeyframeAction
var div = new Div();
div.action = {
    keyframe: [
        { x: 0 },
        { x: 100, time: 500 },
        { x: 0, time: 1000 },
    ],
    loop: -1,
};
var div2 = new Div();
div.action = [
    { x: 0 },
    { x: 100, time: 500 },
];

// 这是建立SequenceAction
var div3 = new Div();
div3.action = {
    seq: [
        [ // 这是个子KeyframeAction
            { x: 0 },
            { x: 100, time: 1e3 },
        ],
        { // 这是个子SpawnAction
            spawn: [
                [ // 这是个子KeyframeAction
                    { y : 100 }, { y: 200, time: 2e3 }
                ],
                [ // 这是个子KeyframeAction
                    { width : 200 }, { width: 100, time: 1e3 }
                ],
            ] 
        }
    ],
};

// 这是建立SpawnAction
var div4 = new Div();
div4.action = {
    spawn: [ // 这里只包含一个子KeyframeAction
        {x: 0}, {x: 200, time: 2e3} 
    ]
};

你们能够看到上面的例子中有4种典型的建立方法。主要看你给的json数据是否存在这三个属性seqspawnkeyframe,对应SpawnActionSequenceActionKeyframeAction,外加一个json数据类型检查,数据类型为数组就建立KeyframeAction。而且这能够嵌套使用。

View.transition()方法

这是一个简单建立简单过渡动画的方法,实现原型为action.jstransition()方法,与View.action同样View.transition()只作简单的转发。

典型应用:

view.transition({
    time: 1000,
    y: 100, 
    x: 100,
})

具体可查阅手册。

View.onActionKeyframe与View.onActionLoop

这两个事件是由动做产生并发送的。

  • View.onActionKeyframe为动做执行到达关键帧时触发。由于画面渲染是固定的帧率,触发老是发生在帧的渲染时,因此可能会与理想中的时间值有所偏差提早或延后,这个延时值会保存在事件数据的delay上。提早为负数,延时为正数。

  • View.onActionLoop动做循环开始时触发,第一次执行动做并不会触发。一样它也会有延时,也一样记录在delay
相关文章
相关标签/搜索