在HellohBolt5中,我们将在HelloBolt4的基础上加入两个很Cool的动画效果,让界面动起来:第一,在关机图标上,每隔5s将其变为另一个图标;第二,当点击关闭按钮时,星星图标在原位置上逐渐变大并消失,正中的HelloBolt文本向右“飞出”界面,之后程序退出。
local aniFactory = XLGetObject("Xunlei.UIEngine.AnimationFactory")
local alphaAni = aniFactory:CreateAnimation("AlphaChangeAnimation")
|
alphaAni:SetTotalTime(700)
alphaAni:SetKeyFrameAlpha(255,0)
|
local owner = self:GetOwner()
local icon = owner:GetUIObject("icon")
|
alphaAni:BindRenderObj(icon)
owner:AddAnimation(alphaAni)
alphaAni:Resume()
|
if newState == 4 then
os.exit()
end
|
posAni2:AttachListener(true,onAniFinish) |
local attr = self:GetAttribute()
local obj = attr.obj
local runningTime = self:GetRuningTime()
|
local aniFactory = XLGetObject("Xunlei.UIEngine.AnimationFactory")
myAni = aniFactory:CreateAnimation("HelloBolt.ani")
myAni:SetTotalTime(9999999)
local aniAttr = myAni:GetAttribute()
aniAttr.obj = newIcon
owner:AddAnimation(myAni)
myAni:Resume()
|
--lua文件必须是UTF-8编码的(最好无BOM头)
function close_btn_OnLButtonDown(self)
---创建内置动画的实例
local aniFactory = XLGetObject("Xunlei.UIEngine.AnimationFactory") --Xunlei.UIEngine.AnimationFactory标识的全局对象是Bolt用于创建动画对象的动画工厂对象
local alphaAni = aniFactory:CreateAnimation("AlphaChangeAnimation") --在动画工厂对象上调用CreateAnimation接口创建指定类型的动画对象
alphaAni:SetTotalTime(700) --一直运行的动画就是一个TotalTime很长的动画
alphaAni:SetKeyFrameAlpha(255,0) --对于改变对象透明度(alpha)的动画来说,要指定执行对象的初始和结束的透明度,
--通过调用SetKeyFrameAlpha接口来设置。这样这个动画就可以在700ms内将执行对象的透明度从全不透明(255)改变到全透明(0).
local owner = self:GetOwner()
local icon = owner:GetUIObject("icon") --以上两行获取指向星星图标对象的引用
alphaAni:BindRenderObj(icon) --用动画的BindRenderObj接口指定执行对象
owner:AddAnimation(alphaAni) --调用AddAnimation接口将动画对象加入到对象树的正在运行动画列表中
alphaAni:Resume() --最后调用Resume接口,指定动画开始执行。
local key = owner:GetUIObject("key") --先获取对象
local posAni = aniFactory:CreateAnimation("PosChangeAnimation")
posAni:SetTotalTime(700)
posAni:SetKeyFrameRect(45,100,45+60,100+60,45+30,100+30,45+60-30-10,100+60-30-10)
--SetKeyFrameRect方法设置对象开始位置和结束位置的left,top,right,bottom信息,对象的尺寸是随着参数变化。
posAni:BindLayoutObj(icon)
owner:AddAnimation(posAni)
posAni:Resume()
--自定义动画
local posAni3 = aniFactory:CreateAnimation("PosChangeAnimation")
posAni3:SetTotalTime(1000)
posAni3:SetKeyFramePos(150,80,600,80)
--SetKeyFrameRect方法设置对象开始位置和结束位置的left,top,right,bottom信息,对象的尺寸是随着参数变化。
posAni3:BindLayoutObj(key)
owner:AddAnimation(posAni3)
posAni3:Resume()
local alphaAni2 = aniFactory:CreateAnimation("AlphaChangeAnimation")
alphaAni2:SetTotalTime(700)
alphaAni2:SetKeyFrameAlpha(255,0) --对于改变对象透明度(alpha)的动画来说,要指定执行对象的初始和结束的透明度,
--通过调用SetKeyFrameAlpha接口来设置。这样这个动画就可以在700ms内将执行对象的透明度从全不透明(255)改变到全透明(0).
local msg = owner:GetUIObject("msg")
alphaAni2:BindRenderObj(msg)
owner:AddAnimation(alphaAni2)
alphaAni2:Resume()
---定义动画结束的回调函数
local function onAniFinish(self,oldState,newState)
if newState == 4 then
----os.exit 效果等同于windows的exit函数,不推荐实际应用中直接使用
os.exit()
end
end
local posAni2 = aniFactory:CreateAnimation("PosChangeAnimation")
posAni2:SetTotalTime(800)
posAni2:BindLayoutObj(msg)
posAni2:SetKeyFramePos(135,100,135,500)
--当动画结束后,应用程序才退出
posAni2:AttachListener(true,onAniFinish) --AttachListener接口指定上面定义的函数作为动画对象的状态响应函数
owner:AddAnimation(posAni2)
posAni2:Resume()
end
function OnInitControl(self)
local owner = self:GetOwner()
--动态创建一个ImageObject,这个Object在XML里没定义
local objFactory = XLGetObject("Xunlei.UIEngine.ObjectFactory")
local newIcon = objFactory:CreateUIObject("icon2","ImageObject")
local xarManager = XLGetObject("Xunlei.UIEngine.XARManager")
newIcon:SetResProvider(xarManager)
newIcon:SetObjPos(45,165,45+70,165+70)
newIcon:SetResID("app.icon2")
local function onClickIcon()
XLMessageBox("Don't touch me!")
end
--绑定鼠标事件的响应函数到对象
newIcon:AttachListener("OnLButtonDown",true,onClickIcon)
self:AddChild(newIcon)
--创建一个自定义动画,作用在刚刚动态创建的ImageObject上
local aniFactory = XLGetObject("Xunlei.UIEngine.AnimationFactory") --Xunlei.UIEngine.AnimationFactory标识的全局对象是Bolt用于创建动画对象的动画工厂对象
myAni = aniFactory:CreateAnimation("HelloBolt.ani") --在动画工厂对象上调用CreateAnimation接口创建指定类型的动画对象
--一直运行的动画就是一个TotalTime很长的动画
myAni:SetTotalTime(9999999) --SetTotalTime接口以ms为单位,指定动画的持续时间
local aniAttr = myAni:GetAttribute()
aniAttr.obj = newIcon
owner:AddAnimation(myAni)
myAni:Resume()
end
function MSG_OnMouseMove(self)
self:SetTextFontResID ("msg.font.bold")
self:SetCursorID ("IDC_HAND")
end
function MSG_OnMouseLeave(self)
self:SetTextFontResID ("msg.font")
self:SetCursorID ("IDC_ARROW")
end
--自定义动画,短函数可以直接在xml里写代码(正规开发不推荐)
local arg={...}
local self = arg[1]
local attr = self:GetAttribute()
local obj = attr.obj
local runningTime = self:GetRuningTime() --调用GetRunningTime() 获取动画对象执行时刻 GetTotalTime() 通过SetTotalTime()设置的持续时间
if runningTime%5000 > 2500 then
obj:SetResID("app.icon2")
else
obj:SetResID("app.icon")
end
return 1
-200
-200
2000
2000
0
0
429
267
app.bkg
255
135
100
250
50
Hello,Bolt!
system.orange
msg.font
150
80
128
128
key
200
0
0
32
father.width
100
father.width/2-86/2
8
86
24
Hello,Bolt!
system.white
default.font
45
100
60
60
app.icon
1
178
214
80
30
0
0
father.width
father.height
button.normal
0
0
father.width
father.height
default.font
center
center
关闭
1
Bolt
1
200
100
429
327
0
0
1000
720
1
0
1
1
1
0
0
100
72
1000
720
1
30