前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >开源跨平台移动项目Ngui【Action动作系统】

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

作者头像
IMWeb前端团队
发布于 2017-12-29 02:24:34
发布于 2017-12-29 02:24:34
1K00
代码可运行
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队
运行总次数:0
代码可运行

Ngui简介

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

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

什么是Action动作

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

动作是什么原理

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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样式表类似。

看下面的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 这是有效的动作
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()方法里实现的。

看例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 这是创建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()只做简单的转发。

典型应用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
view.transition({
    time: 1000,
    y: 100, 
    x: 100,
})

具体可查阅手册。

View.onActionKeyframe与View.onActionLoop

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

  • View.onActionKeyframe为动作执行到达关键帧时触发。因为画面渲染是固定的帧率,触发总是发生在帧的渲染时,所以可能会与理想中的时间值有所误差提前或延后,这个延时值会保存在事件数据的delay上。提前为负数,延时为正数。
  • View.onActionLoop动作循环开始时触发,第一次执行动作并不会触发。同样它也会有延时,也同样记录在delay
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
开源跨平台移动项目Ngui【视图与布局系统】
IMWeb前端团队
2017/12/29
1.3K0
开源跨平台移动项目Ngui【视图与布局系统】
开源跨平台移动项目Ngui【CSS样式表规则及用法】
Ngui简介 这是一个GUI的排版显示引擎和跨平台的GUI应用程序开发框架,基于NodeJS/OpenGL,这也是第一个在移动端Android/iOS融合NodeJS的前端GUI项目,至此JavaSc
IMWeb前端团队
2017/12/29
9520
跨平台开源项目Ngui【基准性能测试报告】
该文对跨平台开源项目Ngui进行基准性能测试,包括创建视图、布局、绘制、事件处理、性能等方面的测试,并对比了iPhone6、Nexus6和iPad mini2在各项指标上的表现。测试结果表明,Nexus6的CPU性能比iPhone6差,但Ngui在Android和iOS上的表现相近。同时,该文还对CSS、Storage、End等方面的性能进行了测试。
IMWeb前端团队
2017/12/29
1.3K0
跨平台开源项目Ngui【基准性能测试报告】
开源跨平台移动项目Ngui【入门】
摘要总结:本文主要介绍了一个基于Node.js的跨平台GUI工具包Ngui,包括其设计初衷,基本架构和主要特性。Ngui旨在开发人员能够编写一次代码,并在多种操作系统和平台上运行,同时能够利用标准浏览器引擎进行渲染。Ngui提供了丰富的组件和工具,方便开发人员快速构建跨平台应用,同时提供了强大的热更新机制。
IMWeb前端团队
2017/12/29
1.3K0
开源跨平台移动项目Ngui【入门】
CSS3变形、渐变、动画的基本使用
CSS3 转换可以对元素进行移动、缩放、转动、拉长或拉伸。 转换的效果是让某个元素改变形状,大小和位置。 您可以使用 2D 或 3D 转换来转换您的元素。 2D变换方法: + translate() + rotate() + scale() + skew() 具体的详情描述可以看:菜鸟教程 简单使用代码
不愿意做鱼的小鲸鱼
2022/09/24
1.4K0
CSS3变形、渐变、动画的基本使用
CSS3动画,为你带来极致的视觉体验!
HTML5学堂:随着网络的发展,浏览器具有更强的渲染与高级代码的执行能力。所以在当前,大量的动画效果由原来的JavaScript制作正慢慢的被CSS3所替代,究其原因在于CSS3的性能会比JS的性能来的好,并且CSS3动画为用户带来了强大而又震撼的效果,为开发者带来了简单的书写方式。 本文主要内容 1、前言 2、实现动画的前奏 3、CSS3动画的语法 4、实例解析 5、总结 1、前言 CSS3属性中有关于制作动画的三个属性:Transform、Transition、Animation;之前一起学习了Tran
HTML5学堂
2018/03/13
1.4K0
CSS3动画,为你带来极致的视觉体验!
【前端面试题】04—33道基础CSS3面试题(附答案)
伴随着大量让人欣喜的功能加入HTML5,CSS3也同样为我们带来了更加绚丽的样式效果。
前端达人
2021/03/16
3K0
网页|CSS的动画实现
一些CSS属性是可以实现动画效果,即我们可以用CSS实现动画和过渡。而动画属性的实现其实就是,属性逐渐地从一个值变化到另一个值,比如尺寸大小、数量、百分比和颜色,也就是通过设置多个节点来精确控制一个,或一组动画,常用来实现复杂的动画效果从而实现动画。动画是CSS最具有颠覆性的特征之一,接下来我们就来感受一下CSS的动画吧。
算法与编程之美
2019/11/29
1.4K0
HTML5+CSS3
CSS权重指的是样式的优先级,有两条或多条样式作用于一个元素,权重高的那条样式对元素起作用,权重相同的,后写的样式会覆盖前面写的样式。
py3study
2020/01/16
2.1K0
CSS3 动画属性
CSS3 动画 虽然transition在一定的时间内可以实现元素的初始状态在指定的时间范围过渡最终状态, 模拟一种过渡动画效果,但它的功能是非常有限的。 因此,CSS3 新增了一个动画属性animation。与过渡属性transition属性不同的是,CSS3 的animation属性可以像Flash制作动画一样,通过关键帧控制动画的每一步, 实现更为复杂的动画效果。 CSS3中通过animation实现动画和transition实现动画非常类似,都是通过改变元素的属性值来实现动画效果的。 它们的区别主要在于:使用 transition属性只能通过指定属性的初始状态和结束状态,然后在两个状态之间进行平滑过渡的方式来实现动画。 而animation实现动画效果主要由两个部分组成: 1). 通过类似Flash动画中的关键帧来声明一个动画; 2). 在animation属性中调用关键帧声明的动画,从而实现一个更为复杂的动画效果。 CSS3动画属性animation和CSS3的transition属性一样是一个复合属性,它包含了8个属性: animation-name,主要用来指定一个关键帧动画的名字,这个动画名必须对应一个@keyframes规则。CSS加载时会应用animation-name指定的动画, 从而执行动画。 animation-duration,主要用来设置动画播放所需时间,一般以秒为单位。 animation-timing- function主要用来设置动画的播放方式,与transition-timing-function类似。 http:/ /www.iis7.com/b/wzjk/ animation-delay、主要用来指定动画开始时间,一般以秒为单位。 animation-iteration- count、主要用来指定动画播放的循环次数。 animation-direction、主要用来指定动画的播放方向。 animation-play- state,主要用来控制动画的播放状态。 animation-fill- mode,主要用来设置动画的时间外属性。br/>:关键帧 在CSS3中,把@keyframes称为关键帧 @keyframes 的作用: transition制作一个简单的动画效果时,包括了元素的初始属性和最终属性,一个开始执行动作时间和一个延迟动作时间以及一个动作变换速率, 其实这些值都是一个中间值,如果要控制得更细一些,比如说要第一个时间段执行什么动作,第二个时间段执行什么动作(换到Flash制作动画中来说,就是第一帧要执行什么动作,第二帧执行什么动作), 这样用transition 就很难实现了,此时也需要一个“ 关键 帧”来控制。 在CSS3中就是通过@keyframes属性来实现这样的效果的。br/>@keyframes的语法: @keyframes具有其自己的语法规则,命名是由@keyframes开头,后面紧跟着是“动画的名称”加上一对花括号“{...}”,括号中就不同时间段样式规则,有点像CSS的样式写法。一个@keyframes中的样式规则是由多个百分比构成的,如0%~100%,可以在这个规则中创建更多个百分比,分别给每个百分比中需要有动画效果的元素加上不同的属性,从而让元素达到一种不断变化的效果,比如说移动,再比如改变元素颜色、位置、大小和形状等。 不过有一点需要注意, 可以使用“ frome”“to”代表一个动画是从哪开始,到哪结束,也就是说from就相当于0%,而to相当于100%。值得说的是,0%不能像别的属性取值一样把百分比符号省略,在这里必须加上百分符号(%)。如果没有加上,这个@keyframes是无效的,不起任何作用。因为@keyframes的单位只接受百分比值。@keyframes可以指定任何顺序排列来决定animation动画变化的关键位置 CSS中为元素应用动画: 要在CSS中为元素应用动画, 首先要创建一个已命名的动画,然后将它附加到该元素属性声明块中的一个元素上。 动画本身并不执行任何操作; 为了向元素应用动画,需要将动画与元素关联起来。这个要创建的动画,必须使用@keyframes来声明(或者对于当前的Webkit实现,使用@-webkit-keyframes),后跟所选择的名称,该名称主要用于对动画的声明作用,然后指定关键帧。 :CSS3动画8个子属性详解
py3study
2020/01/08
1.2K0
八.CSS之animation(动画)
​ 多个属性间使用,隔开 ​ 如果所有属性都需要过渡,则使用all关键字 ​ 大部分属性都支持过渡效果,注意过渡时必须是从一个有效数值向另外一个有效数值进行过渡(auto不是有效数值,过渡动画效果不会生效)
小海怪的互联网
2020/11/24
9940
CSS3过渡与动画
   增强页面渲染性能,提前通知浏览器元素将要做什么动画,让浏览器提前准备合适的优化设置
Leophen
2019/08/23
8200
Css3新特性应用之过渡与动画
一、缓动效果 学习和利用贝塞尔曲线,默认支持ease,ease-in,ease-out,ease-in-out和linear等 还提供一个cubic-beizer自定义贝塞尔曲线的起点和终点 Css中只支持一条贝塞尔曲的运动,不能连续多段 对cubic-beizer中控制锚点的水平坐标与垂直坐标互换,就可以得到任何调整函数的反向版本 cubic-beizer(.1,.25,1,.25)是ease的反向调整函数 水平坐标只能在0~1的范围内,因为水平坐标表示的是时间 垂直坐标可以超过此范围,表示为运动距离
sam dragon
2018/01/17
1.1K0
Android入门教程之Activity(生命周期,启动...)
Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。
Android_anzi
2021/10/19
1.2K0
移动跨平台ReactNative动画组件Animated【14】
而有生命的物体,会有各种动作,可以从一个地方走到另一个地方,可以模仿其它动物,会吃,会喝,会睡觉。
江一铭
2022/06/17
9150
Angular2 之 Animations
Angular2的动画系统赋予了制作各种动画效果的能力,致力于构建出与原生CSS动画性能相同的动画。 Angular2的动画主要是和@Component结合在了一起。 animations元数据属性在定义@Component装饰。就像template元数据属性!这样就可以让动画逻辑与其应用代码紧紧集成在一起,这让动画可以更容易的出发与控制。 使用要点 Angular2的动画是使用<u>模型驱动</u>的方式在两个状态之间进行转换,是由状态和状态之间的转场效果所定义的。 动画被定义在@Compone
贺贺V5
2018/08/21
2K0
Angular2 之 Animations
–探索CSS3动画、过渡
###让我们一起来探索 Transiton(过渡), Transform(变化) , Animation(动画)属性吧! ---- ###Transiton(过渡) transition 属性简写: transition: property(过渡的css属性) duration(持续时间) timing-function(过渡类型) delay(延迟过渡时间); 默认值: transition:all 0 ease 0 详细属性值: transition-property : //设置过渡效果的 CS
大象无痕
2018/07/17
7720
【前端攻略--HTML/CSS】这是你需要的transform学习教程
transition语法格式:transition: property duration timing-function delay;
野原测试开发
2019/07/10
1K0
搞定这些疑难杂症,向css3动画说yes
本文篇幅比较长,涉及到的知识点也比较多,如3d,动画性能,动画js事件等,参考文献及demo展示也比较多,所以建议pc阅读效果更佳。 动画库 到现在来说css3动画也不是什么新技术,既然是要搞定它,好歹我们也得先看下别人做的一些东西吧,所以在此先向各位推荐几个比较好用的动画库: animate.css effeckt hover.css animatable 关于css3动画不得不说的几个属性 看完上面那些动画库,心痒就不如行动了。 说起css3动画,有一个属性我们绝对避不开了,那就是transform这个
IMWeb前端团队
2018/01/15
2.1K0
搞定这些疑难杂症,向css3动画说yes
CSS3 动画
渐变指在两个或多个指定的颜色之间显示平稳的过渡,渐变一般分为线性渐变和径向渐变,呈一条直线渐变的称作线性渐变,而从圆心到四周扩散的过程成为径向渐变
Nian糕
2020/06/05
8260
CSS3 动画
相关推荐
开源跨平台移动项目Ngui【视图与布局系统】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验