引擎内置的  种动画
--PosChangeAnimation 平移
local ani = XLGetObject("Xunlei.UIEngine.AnimationFactory"):CreateAnimation("PosChangeAnimation")
ani:BindObj(imageObj)
ani:SetTotalTime()
ani:SetLoop(true)
ani:SetKeyFramePos(,,,)
imageObj:GetOwner():AddAnimation(ani)
ani:Resume() --AngleChangeAnimation 旋转
local ani = XLGetObject("Xunlei.UIEngine.AnimationFactory"):CreateAnimation("AngleChangeAnimation")
ani:BindObj(imageObj)
ani:SetKeyFrameAngle(,,,,,)
ani:SetTotalTime()
ani:SetLoop(true)
ani:SetBlendMode("AntiAlias")
imageObj:GetOwner():AddAnimation(ani)
ani:Resume() --AlphaChangeAnimation 透明度
local ani = XLGetObject("Xunlei.UIEngine.AnimationFactory"):CreateAnimation("AlphaChangeAnimation")
ani:BindRenderObj(imageObj)
ani:SetTotalTime()
ani:SetKeyFrameAlpha(,)
imageObj:GetOwner():AddAnimation(ani)
ani:Resume() --SeqFrameAnimation 序列帧
local ani = XLGetObject("Xunlei.UIEngine.AnimationFactory"):CreateAnimation("SeqFrameAnimation")
ani:BindImageObj(imageObj)
ani:SetTotalTime()
ani:SetLoop(true)
ani:SetResID("ImageSeq.BoltTest.SeqAni")
imageObj:GetOwner():AddAnimation(ani)
ani:Resume() --TurnObjectAnimation 对象1旋转到对象2
local imageObj2 = ctrlObj:GetControlObject("TestAni2.Texture")
local ani = XLGetObject("Xunlei.UIEngine.AnimationFactory"):CreateAnimation("TurnObjectAnimation")
ani:BindRenderObj(imageObj1,imageObj2)
ani:SetFlag("RoundY")
ani:SetTotalTime("")
imageObj1:GetOwner():AddAnimation(ani)
ani:Resume() --MaskChangeAnimation MaskObject 位置改变
local maskObj = ctrlObj:GetControlObject("MaskAni.Mask")
local uiObject = ctrlObj:GetControlObject("MaskAniBkg.Texture")
local ani = XLGetObject("Xunlei.UIEngine.AnimationFactory"):CreateAnimation("MaskChangeAnimation")
ani:BindMaskObj(maskObj)
ani:SetMaskKeyFrame(,,,,,-,,)
ani:SetLoop(true)
ani:SetTotalTime()
maskObj:GetOwner():AddAnimation(ani)
ani:Resume() MaskObject 的使用方法参考相关文档;
注意这里只调用了 BindMaskObj 而没有调用 BindTargetObj ,不知道为啥调用了 BindTargetObj 之后动画并不会被执行
注意:不知道为啥旋转动画不能在OnInitControl里面直接使用,需要用AsynCall调用才行:
function OnInitControl(ctrlObj)
local imageObj = ctrlObj:GetControlObject("TestAni.Image") AsynCall(function() -- 异步调用
-- AngleChangeAnimation 旋转
local rotateAni = XLGetObject("Xunlei.UIEngine.AnimationFactory"):CreateAnimation("AngleChangeAnimation")
rotateAni:BindObj(imageObj)
rotateAni:SetKeyFrameAngle(,,,,,)
rotateAni:SetTotalTime()
rotateAni:SetLoop(false)
rotateAni:SetBlendMode("AntiAlias")
imageObj:GetOwner():AddAnimation(rotateAni)
rotateAni:Resume()
end)
end 自定义动画:
在 xml 文件里定义动画模版:
<animation_def class="BoltTest.ani">
<method_def>
<Action file="MainWnd.xml.lua" func="BoltTestAni_Action"/>
<BindObj file="MainWnd.xml.lua" func="BoltTestAni_BindObj"/>
<GetBindObj file="MainWnd.xml.lua" func="BoltTestAni_GetBindObj" />
</method_def>
</animation_def> 在 lua 文件里使用动画:
function BoltTestAni_Action(aniSelf)
local attr = aniSelf:GetAttribute()
local bindObj = attr.BindObj
if bindObj == nil then
return
end local totalTime = aniSelf:GetTotalTime()
local runningTime = aniSelf:GetRuningTime() --[[ 按时间缩小
local progress = (totalTime - runningTime) / totalTime
if progress < 0 then
progress = 0
end
local l,t,r,b = bindObj:GetObjPos()
bindObj:SetObjPos(l,t,r,t+(b-t)*progress)
--]] -- 按指定间隔切换图片
local frameTime =
local progress = runningTime / frameTime +
if progress > then
progress =
elseif progress < then
progress =
end
progress = math.floor(progress)
bindObj:SetResID("Bitmap.BoltTest.SeqAni"..progress)
end
function BoltTestAni_BindObj(aniSelf, obj)
local attr = aniSelf:GetAttribute()
attr.BindObj = obj
end
function BoltTestAni_GetBindObj(aniSelf)
local attr = aniSelf:GetAttribute()
return attr.BindObj
end 注意:XLUE 每隔 / 秒刷新一次界面,每次刷新时改变对象的状态,这是自定义动画的基本原理;
Action 方法每隔 / 秒调用一次;
BindObj 方法里通过 attr 表来保存要渲染的对象;
GetRuningTime 方法获取动画的运行时间,因为是每隔 / 秒调用一次 Action 方法,所以 GetRuningTime 也是每隔 / 递增 动画的状态改变事件:
-- state: 0 动画未绑定对象;1 动画准备就绪;2 动画正在执行;3 动画暂停; 4 动画结束
ani:AttachListener(true, function(aniSelf, oldState, newState)
-- TODO
end)
注意这里,如果设定动画 SetLoop(true) state 将在 和 之间转换;
对一个动画进行 Stop,state 变为 而不是 ;也就是动画结束而不是动画暂停;
对一个动画进行 Stop,再调用 resume 并不能够使暂停的动画重新开始;
对一个动画进行 Stop,该动画实例即失效,需要重新创建该动画才能使动画重新运行 同时执行多个动画:
将多个动画对象绑定到同一个 UIObject 上即可:
-- PosChangeAnimation 平移
local ani = XLGetObject("Xunlei.UIEngine.AnimationFactory"):CreateAnimation("PosChangeAnimation")
ani:BindObj(imageObj)
ani:SetTotalTime()
ani:SetLoop(false)
ani:SetKeyFramePos(,,,)
imageObj:GetOwner():AddAnimation(ani)
ani:Resume() --SeqFrameAnimation 序列帧
local ani = XLGetObject("Xunlei.UIEngine.AnimationFactory"):CreateAnimation("SeqFrameAnimation")
ani:BindImageObj(imageObj)
ani:SetTotalTime()
ani:SetLoop(true)
ani:SetResID("ImageSeq.BoltTest.SeqAni")
imageObj:GetOwner():AddAnimation(ani)
ani:Resume()
注意这里,不知道为啥 AngleChangeAnimation 旋转动画跟 SeqFrameAnimation 序列帧动画不能一起用; 执行动画序列:
local function StartAnimSequence(onFinish, ...)
local function StartAnim(aniIndex)
if arg[aniIndex] == nil then
onFinish()
return
end
arg[aniIndex]:AttachListener(true, function(aniSelf, oldState, newState)
if newState == then
StartAnim(aniIndex + )
end
end)
arg[aniIndex]:Resume()
end
StartAnim()
end
StartAnimSequence(function() return end, posAni, rotateAni)
尝试用这种方法封装一个执行动画序列的方法;发现不行,不知道为啥; 动画曲线:
在资源 xml 里定义 curve 资源,可使用 CurveTool 工具来定义:
<curve id="Curve.BoltTest.MyAni" type="bspline">
<controlpoint tp="0.000000" sp="0.000000"/>
<controlpoint tp="0.854396" sp="0.025281"/>
<controlpoint tp="0.859890" sp="0.977528"/>
<controlpoint tp="0.997253" sp="1.000000"/>
</curve>
在自定义动画里通过 Curve:GetProgress(tp) 传入一个时间,获取对应的进度:
local curve = aniSelf:GetCurve()
local tp = runningTime / totalTime
local progress = curve:GetProgress(tp)
利用这个 progress 来设定进度即可

Bolt 动画的更多相关文章

  1. 动画requestAnimationFrame

    前言 在研究canvas的2D pixi.js库的时候,其动画的刷新都用requestAnimationFrame替代了setTimeout 或 setInterval 但是jQuery中还是采用了s ...

  2. 梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画

    CSS动画并不是绝对比JavaScript动画性能更优越,开源动画库Velocity.js等就展现了强劲的性能. 一.两者的主要区别 先开门见山的说说两者之间的区别. 1)CSS动画: 基于CSS的动 ...

  3. CSS 3学习——animation动画

    以下内容根据官方文档翻译以及自己的理解整理. 1.  介绍 本方案介绍动画(animations).通过动画,开发者可以将CSS属性值的变化指定为一个随时间变化的关键帧(keyframes)的集合.在 ...

  4. javascript动画系列第三篇——碰撞检测

    前面的话 前面分别介绍了拖拽模拟和磁性吸附,当可视区域内存在多个可拖拽元素,就出现碰撞检测的问题,这也是javascript动画的一个经典问题.本篇将详细介绍碰撞检测 原理介绍 碰撞检测的方法有很多, ...

  5. 虾扯蛋:Android View动画 Animation不完全解析

    本文结合一些周知的概念和源码片段,对View动画的工作原理进行挖掘和分析.以下不是对源码一丝不苟的分析过程,只是以搞清楚Animation的执行过程.如何被周期性调用为目标粗略分析下相关方法的执行细节 ...

  6. Visaul Studio 常用快捷键的动画演示

    从本篇文章开始,我将会陆续介绍提高 VS 开发效率的文章,欢迎大家补充~ 在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以 ...

  7. transtion:过渡动画

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Monaco; color: #4f5d66 } p.p2 { margin: 0.0px 0 ...

  8. 再谈CAAnimation动画

    CAAnimaton动画分为CABasicAnimation & CAKeyframeAnimation CABasicAnimation动画, 顾名思义就是最基本的动画, 老规矩先上代码: ...

  9. jQuery动画-圣诞节礼物

    ▓▓▓▓▓▓ 大致介绍 下午看到了一个送圣诞礼物的小动画,正好要快到圣诞节了,就动手模仿并改进了一些小问题 原地址:花式轮播----圣诞礼物传送 思路:动画中一共有五个礼物,他们平均分布在屏幕中,设置 ...

随机推荐

  1. Sandcastle是什么

    如果你的项目是.net开发,同时需要生成HTML的方法成员文档时,哪么就不得不拿出Sandcastle 因为Sandcastle是微软开发,并开源的文档生成工具; 这种生成进度等待的感觉很爽! 在这里 ...

  2. 【转】你需要知道的Python用法

    在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性.一些可以说是非常有用,但却没有充分利用.考虑到这一点,我编辑了一些的你应该了解的Pyghon功能特色. 带任意数量参数的函数 你 ...

  3. 对现有Hive的大表进行动态分区

    分区是在处理大型事实表时常用的方法.分区的好处在于缩小查询扫描范围,从而提高速度.分区分为两种:静态分区static partition和动态分区dynamic partition.静态分区和动态分区 ...

  4. 在Linux下写一个简单的驱动程序

    本文首先描述了一个可以实际测试运行的驱动实例,然后由此去讨论Linux下驱动模板的要素,以及Linux上应用程序到驱动的执行过程.相信这样由浅入深.由具体实例到抽象理论的描述更容易初学者入手Linux ...

  5. ServiceStack.OrmLite 调用存储过程

    最近在做关于ServiceStack.OrmLite调用存储过程时,有问题.发现ServiceStack.OrmLite不能调用存储过程,或者说不能实现我想要的需求.在做分页查询时,我需要传入参数传出 ...

  6. spring中Bean的注入类型

    1.属性注入    即通过setXxx()方法注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常采用的注入方式.    属性注入要求Bean提供 ...

  7. Java高效读取大文件

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 ...

  8. 多态&&父类调用子类特有的方法

    /* 多态 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数\方法参数使用的是父类对象,可以传入父类.子类对象 4.局限性: 1>父类类型的变量,不能直接调 ...

  9. 线性判别分析(LDA), 主成分分析(PCA)及其推导【转】

    前言: 如果学习分类算法,最好从线性的入手,线性分类器最简单的就是LDA,它可以看做是简化版的SVM,如果想理解SVM这种分类器,那理解LDA就是很有必要的了. 谈到LDA,就不得不谈谈PCA,PCA ...

  10. 1069: [SCOI2007]最大土地面积 - BZOJ

    Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大.Input 第1行一个正整数N,接下来N行,每行2个数x,y, ...