一个强大的UI node 抽象

基于cocos2d -x的一个强大的 界面对象的基类

  1 ---@type uinode ui 对象的抽象
  2 --@usage
  3 --       界面打开的执行流程
  4 --       带*的是可选重写的函数,不带*的为必须实现的
  5 --       [定义一个对象]
  6 --       test = {}
  7 --       --------------------------------------------
  8 --       ---配置函数
  9 --       [返回CCBI的名字]
 10 --       function test:getBindUINodeStr() end
 11 --       [*显示模式,不实现是直接打开。不会居中]
 12 --       function test:getShowModel() end
 13 --       --------------------------------------------
 14 --       ---流程函数
 15 --       [*打开界面前要执行网络操作]
 16 --       function test:getCmdStr() end
 17 --       [*打开界面前要执行网络操作需要的数据]
 18 --       function test:getCmdData() end
 19 --       网络命令成功后会进行的操作
 20 --       function test:onRemoteAck(networkArgs) end
 21 --       [*初始化界面上的相关信息]
 22 --       function test:on_initUI(node,openArgs,networkArgs) end
 23 --       [*关闭界面前要进行网络通信]
 24 --       function test:before_close(ackfun) end
 25 --       -----------------------------------------------------------------
 26 --       PS:当有*函数的出现,只要*函数执行成功,才会调用之后的函数
 27 --
 28 --       usage: local obj = test.getInstance()
 29 --              obj:open(args)  --args 为要传送到on_initUI中的args数据
 30 uinode ={}
 31
 32 require("base")
 33 require("userGuidelines")
 34
 35 ---===============================================================
 36 ---IUiNode interface
 37 IUiNode = {}
 38 ---IUiNode interface
 39 createInterface(IUiNode,"IUiNode",function(self,openArgs) end)
 40 ---===============================================================
 41
 42 ---@field 是否为中心显示
 43 uinode.isShowInCenterFlg = false
 44 ---@field 当前绑定的节点
 45 --@return #cc.Node cc.node节点
 46 uinode.node = nil
 47 uinode ,supper= inheritance(uinode,object)
 48
 49 ------------------------------------------------------------------------
 50 --显示模式定义
 51 uinode.showModel = {
 52     NOTADDTO_CONTENT = -1,
 53     NONE = 0,
 54     NORMAL = 1,
 55     CENTER=2,
 56     DELAYED_SHUTDOWN=3,
 57     nil
 58 }
 59
 60 ----------------------------------------------------------
 61 ---资源管理器
 62 local unloadResource =  {}
 63
 64 function uinode:unloadCustomResources()
 65     local res = self:__getCustomResources()
 66     if res ~= nil and #res > 0 then
 67         xse.base.unloadTextures(res)
 68     end
 69 end
 70
 71 function uinode:__getCustomResources()
 72     if self.getCustomResources ==  nil then return {} end
 73     local resources = self:getCustomResources()
 74     return resources or  {}
 75 end
 76
 77 function uinode:starLoadResource()
 78     if self.mask == nil then
 79         self.mask = xse.base.loadCCBI("waitting.ccbi",false)
 80         xse.base.Scene:addChild(self.mask,999999999)
 81     end
 82 end
 83
 84 function uinode:endLoadResource()
 85     xse.base.Scene:removeChild(self.mask)
 86     self.mask = nil
 87 end
 88
 89 ---加载资源
 90 function uinode:loadResource(onloadComplate)
 91     if uinode.__getCustomResources ~= nil then
 92         local res =  self:__getCustomResources()
 93         if res == nil or #res == 0 then onloadComplate()
 94         else
 95             local __id = nil
 96             local __index  = 1
 97             local __timerCounter = 1
 98             self:starLoadResource()
 99             local loaded = false
100             __id = xse.base.timer.tick.add(function()
101                 if loaded ~= true then loaded = true
102                     for var=1, #res do
103                         cc.Director:getInstance():getTextureCache():addImageAsync(res[var],
104                             function()
105                                 log("set load command :"..res[var])
106                                 __index = __index + 1
107                             end)
108                     end
109                 end
110
111                 __timerCounter = __timerCounter + 1
112                 if __index >=  #res and __timerCounter > 100 then
113                     onloadComplate()
114                     self:endLoadResource()
115                     xse.base.timer.tick.remove(__id)
116                 end
117             end)
118         end
119     elseif onloadComplate~= nil then
120         onloadComplate()
121     end
122 end
123
124 -------------------------------------------------------------------------
125 --帮助函数私有成员函数
126
127 ---加载CCBI文件
128 [email protected] nodestr string 要加载的资源名字,不包含后缀名
129 --@return #cc.Node 一个node节点
130 function uinode:loadCCBI(nodestr)
131     assert(nodestr~=nil and type(nodestr)=="string","param nodestr must a string type")
132 --    local node = xse.base.loadScene(nodestr,nil,self:getShowModel()== uinode.showModel.CENTER)
133     local node = xse.base.loadScene(nodestr,nil)
134     return node
135 end
136
137 ---为当前对象绑定一个ccbi
138 [email protected] nodestr string 要加载的资源名字,不包含后缀名
139 --@return cc.Node 当前对象绑定的节点
140 function uinode:bindCCBI(nodestr)
141     if self.node~=nil then
142         local parent = self.node:getParent()
143         if parent then parent:removeChild(parent) end
144         self.node = nil
145     end
146
147     if self.node == nil then
148         self:registeUICallBack()
149         self.node = self:loadCCBI(nodestr)
150         self.node.__bindToInstance = self
151     end
152     return self.node
153 end
154
155 ---绑定脚本到ccbi上
156 function uinode:bindScriptToNode(node)
157     node.__bindToInstance = self
158 end
159
160 ---卸载ccbi文件
161 [email protected] nodestr string 要卸载的资源名字,不包含后缀名
162 function uinode:unloadCCBI(nodestr)
163     assert("false","暂时不支持的方法")
164 end
165
166 ---重新加载CCBI文件
167 [email protected] nodestr string 要加载的资源名字,不包含后缀名
168 function uinode:reloadCCBI()
169     local parent = self.node:getParent()
170     if parent ~= nil then parent:removeChild(self.node)end
171     self:bindCCBI(self:getBindUINodeStr())
172 end
173
174 ---显示界面函数
175 function uinode:show(onshowComplate)
176     assert(onshowComplate,"callbakc is nil value")
177     switch(self:getShowModel(),{
178
179             [uinode.showModel.NOTADDTO_CONTENT] = function()
180                 ---不设置为添加到窗口中,就直接调用aftershow
181                 self:afterShow()
182             end,
183
184             [uinode.showModel.NORMAL] = function()
185                 ---添加到界面上
186                 xse.base.show(nil,self.node)
187                 ---显示动画
188                 xse.base.animal.show(
189                     self.node,
190                     nil,
191                     function() onshowComplate() ; self:afterShow() end
192                 )
193             end,
194
195             [uinode.showModel.CENTER] = function()
196                 onshowComplate();
197                 xse.base.animal.showOnCenter(self.node,nil,
198                     function() self:close(); end,
199                     self,
200                     function ()
201                         self:afterShow();
202                     end)
203             end,
204
205             [uinode.showModel.DELAYED_SHUTDOWN] = function()
206                 onshowComplate();
207                 xse.base.show(nil,self.node);
208             end,
209
210             [uinode.showModel.NONE] = function()
211                 xse.base.animal.show(self.node,xse.base.Scene,
212                     function()
213                         onshowComplate();
214                         self:afterShow();
215                     end, false
216                 ) end,
217
218             ["default"] = function()
219                 xse.base.animal.show(self.node,
220                     nil,
221                     function() onshowComplate();self:afterShow() end)
222             end,
223     })
224
225     self:endLoadResource()
226 end
227
228 function uinode:afterShow()
229
230 end
231
232 function uinode:processClose()
233     self.moreNode = nil
234     switch(self:getShowModel(),{
235         [uinode.showModel.NORMAL] = function()
236             xse.base.hide(nil,self.node,function()
237                 self:after_close()
238             end);
239             self.node = nil;
240         end,
241         [uinode.showModel.CENTER] = function()
242             xse.base.hide(nil,self.node,function()
243                 self:after_close()
244             end);
245             self.node = nil;
246         end,
247         [uinode.showModel.DELAYED_SHUTDOWN] = function()
248             local action = cc.Sequence:create(cc.DelayTime:create(1),cc.CallFunc:create(function()
249                 xse.base.hide(nil,self.node,function() self:after_close() end);
250                 self.node = nil;
251             end))
252             self.node:runAction(action)
253         end,
254         ["default"] = function()
255             xse.base.hide(nil,self.node,function()
256                 self:after_close()
257             end);
258             self.node = nil;
259         end,
260     })
261
262
263 end
264
265 function uinode:after_close()
266     self:unloadCustomResources()
267 end
268
269 ---关闭界面函数
270 function uinode:close(sender)
271     log("#close ".. tostring(self:getHashCode()))
272     ---在关闭前的回掉
273     if self.before_close ~=nil and type(self.before_close) == "function" then
274         self:before_close(function(rd,sn,sd)
275             if type(sender) == "function" then sender()end
276         end)
277         self:processClose()
278     else
279         if type(sender) == "function" then  sender() end
280         self:processClose()
281     end
282     self:unregisteUICallBack() --避免在关闭的时候还有操作造成无法处理的bug
283 end
284
285 ---注册自己定义的ui回调事件
286 function uinode:setCustomUiCallBack()
287 ---不做任何事情,留给子类去处理
288 end
289
290 ---注册当前node 的回调事件
291 function uinode:registeUICallBack()
292     ---自定义事件注册
293     self:setCustomUiCallBack()
294     ---
295     local name = self:getName()
296     if name ~="unkonw" then
297         for key, var in pairs(self) do
298             if type(var)== "function"then
299                 xse.base.addEventSupportA(name,key,
300                     function(sender)
301                         assert(sender~=nil,"sender is nil value")
302                         local __callinstance = nil
303                         local tempsender = sender
304                         local obj = sender
305                         while sender ~= nil and (type(sender)== "table" or  type(sender)== "userdata") do
306                             assert(not (__callinstance and sender.__bindToInstance),"子节点界面不应该单独绑定到uinode上")
307                             if sender.__bindToInstance~= nil then
308                                 __callinstance = sender.__bindToInstance
309                                 break;
310                             end
311                             sender = sender:getParent()
312                         end
313
314                         if __callinstance~=nil then
315                             local fun = __callinstance[key]
316                             fun(__callinstance,tempsender)
317                             return
318                         end
319
320                         assert(false,"Have not found the bound script logic in all parent nodes,")
321                     end)
322             end
323         end
324     end
325 end
326
327 ---注册当前node ui 的回调事件
328 function uinode:unregisteUICallBack()
329     local name = self:getName()
330     if name ~="unkonw" then
331         for key, var in pairs(self) do
332             if type(var)== "function"then
333                 ---取消事件注册
334                 xse.base.addEventSupportA(name,key,nil)
335             end
336         end
337     end
338 end
339
340 ---------------------------------------------------------------------------
341 --业务接口
342
343 ---禁止重写这个函数®
344 function uinode:open(openArgs)
345     if self.UserGuidelineSupportConfig then
346         self.userGuideLineConfigKey =  xse.base.random()
347         userGuidelineManager:addUserGuidelineSupportA(self,self.userGuideLineConfigKey)
348     end
349
350     self:loadResource(function()
351         local ccbstr = self:getBindUINodeStr()
352         assert(ccbstr,"self:getBindUINodeStr()返回的数据不合法")
353         self:bindCCBI(ccbstr)---绑定界面
354
355         local function init(self)
356             self.__openArgs = openArgs
357             ---发送网络命令
358             if self.getCmdStr and type(self.getCmdStr) == "function" then
359                 local cmdstr = self:getCmdStr()
360                 local dt = self:getCmdData()
361                 ---发送网络通信
362                 local remoteTask,protocal,command = require "remoteTask",require "protocal",require "command"
363                 assert(cmdstr,"Rewrite getCmdStr function, but the data returned is empty.")
364                 protocal:adddt(command[cmdstr],dt)
365                 local sn = remoteTask.add(protocal,communication.type.tcp,function(rd,sn,sd,self)
366                     if self.onRemoteAck then self:onRemoteAck(rd) end
367                     self:show(function()
368                         self:on_initUI(self.node,self.__openArgs,rd)
369                     end)
370                 end,nil,self)
371
372             else
373                 self:on_initUI(self.node,self.__openArgs,rd)
374                 self:show(function()
375                     --self:on_iniself:on_initUI(self.node,self.__openArgs,rd)tUI(self.node,self.__openArgs,rd)
376                     end)
377             end
378         end
379
380         ---DEBUG模式下调用初始化一些必要的基础数据
381         debugCallFun(function()
382             require("tcpExt")
383             ---刷新全部依赖的数据
384             tcpTaskQueue({
385                 {cmd = "WORLD_INIT",dt = {},callback = function(rd,sn,sd) init(self) end,errfun = nil},
386                 {cmd = "COMPANY_INIT",dt = {},callback = function(rd,sn,sd) end,errfun = nil},
387             })
388         end,nil)
389
390         releaseCallFun(init,self)
391     end)
392 end
393
394 ---绑定界面函数 [可重写]
395 -- @return #string 要绑定的界面,不包含后缀名
396 function uinode:getBindUINodeStr()
397     assert(false,"必须实现要绑定的界面")
398     return nil
399 end
400
401 ---显示模式 [可选函数]
402 --@return #uinode.showModel 现实的模式
403 --PS:[显示模式,不实现是直接打开。不会居中]
404 function uinode:getShowModel()
405     return uinode.showModel.NORMAL
406 end
407
408 ---打开界面前要执行网络操作[可选函数]
409 [email protected] cmdstr string
410 --function uinode:getCmdStr()
411 --    return nil
412 --end
413 --uinode.getCmdStr = nil
414
415 ---发送网络命令需要的数据
416 --@return table #table,加载界面前发送网络命令时需要的数据
417 function uinode:getCmdData()
418     return  {}
419 end
420
421 --
422
423
424 ---初始化界面上的相关信息[可选函数]
425 --@param node cc.Node 界面已绑定好的节点
426 --@param openArgs unknow open方法穿过来的数据
427 --@param networkArgs unknow 没有使用网络函数为nil,使用了网络函数:就为网络返回的数据
428 --@return nil
429 function uinode:on_initUI(node,openArgs,networkArgs)
430 --    self:on_initUI(node, opendArgs, networkArgs);
431 end
432
433 ---关闭界面前要进行网络通信 [可选函数]
434 --@param networkACKCallBack function(rd,sn,sd) 网络成功后的回掉函数
435 --@return nil
436 function uinode:before_close(networkACKCallBack)
437     return false
438 end
439
440 uinode.before_close = nil
441
442 return uinode

使用DEMO

local story = {}

require("depend")
require("tableViewExt")
require("uinode")
local tabView = require "TabView"
local text = require("richtext")

inheritanceA(story,object,"object")
inheritanceA(story,uinode,"uinode")
--uinode abstract function
implementInterface(story,"getShowModel",function(self)  return uinode.showModel.NONE end )
implementInterface(story,"getBindUINodeStr",function(self)  return "start01" end )
implementInterface(story,"getName",function(self) return "message_layer" end )
implementInterface(story,"on_initUI",function(self,node,openArgs,networkArgs) self:init(node,openArgs,networkArgs) end )

function story:init()
    cc.SimpleAudioEngine:getInstance():stopMusic()
    cc.SimpleAudioEngine:getInstance():playMusic("storyBackgroudn.mp3",true)

    local daytime = cc.DelayTime:create(1)
    --TODO::增加语言
    self.fontConfig =  {{fontSize = 30,str="23世界末,第三次世界大战\"能源战\"爆发。\"联军\"为了维持庞大的军费开支,开始将阿波罗-188号飞船用于商用。一些富商为了躲避战火纷纷变卖资产换取船票前往“开普勒”,而您,曾经闻名于世的一代商业传奇人物,也随着这波人流,开启了一段新的征程。",color = xse.color.GREEN}}
    local funAction = cc.CallFunc:create(function()
        self.text = richtext.playMessage(self,self.node, self.fontConfig,function()
            local daytime2 = cc.DelayTime:create(1)
            local nextaction = cc.CallFunc:create(function()
                xse.base.setCCBottonOnClick(self.node:getChildByTag(200),function() self:swithNode() end,self)
                --self:swithNode()
                self.node:getChildByTag(200):setVisible(true)
            end)
            self.node:runAction(cc.Sequence:create(daytime2,nextaction))
        end)
    end)

    self.node:runAction(cc.Sequence:create(daytime,funAction))
    self.node:getChildByTag(200):setVisible(false)
--    self.text=richtext.playMessage(self,self.node, self.fontConfig)
--    xse.base.setCCBottonOnClick(self.node:getChildByTag(200),function() self:swithNode() end,self)
end

function story:swithNode()
    local layer = self.node:getParent()
    self.text:getParent():removeChild(self.text)
    layer:removeChild(self.node)
    self.node = xse.base.loadCCBI("start02.ccbi")
    xse.base.show(layer,self.node)

    local daytime2 = cc.DelayTime:create(8)
    local nextaction = cc.CallFunc:create(function()
        local instance = require("citadel")
        instance:new():open()
    end)
    self.node:runAction(cc.Sequence:create(daytime2,nextaction))
end

return story
时间: 2024-10-25 17:01:38

一个强大的UI node 抽象的相关文章

Android:一个高效的UI才是一个拉风的UI(二)

趁今晚老大不在偷偷早下班,所以有时间继续跟大伙扯扯UI设计之痛,也算一个是对上篇<Android:一个高效的UI才是一个拉风的UI(一)>的完整补充吧.写得不好的话大家尽管拍砖~(来!砸死我把~) 前言 前篇博客翻箱倒柜的介绍了优化UI设计的两个方法,第一个就是使用尽量少的组件来实现布局功能,第二个就是使用<meger>标签来减少不必要的根节点,这两个方法都可以提高应用UI的运行效率,但是够了吗?远远是不够的,方法就像money一样永远不嫌多,所以不再介绍多一些UI设计优化的方法说

一个强大的Java开源遥感处理软件(库)---Beam

1.Beam简介 为了在Hadoop中可以序列化HDF文件,在各种搜索之后,无意中发现了一个强大的Java开源软件,它就是Beam. 对于从事遥感的研究者来说,可以通过安装Beam,将它当成一个强大开源的遥感处理软件使用.虽然没有envi那么好用,还马马虎虎过得去.至少安装Beam,不用授权文件去破解~ 对于遥感软件开发人员来说,Beam的库简直一大利器!!! 用Java实现什么重投影.波段运算.主成分分析.图像裁剪.图像镶嵌,创建直方图,五花八门.各式各样.繁简不一的遥感操作,对它来说都是一碟

[安卓基础] 005.创建一个简单的UI

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin

为Visual Studio添加一个“编码的UI测试生成器”的快捷方式

在添加CodedUI测试用例时,经常需要查看捕获控件的属性.按照常规的方式,只有在添加一个全新的CodedUI编码测试时才能查看捕获控件的属性,这样很不方便. 下面介绍在Visual Studio工具栏里添加一个快捷方式,随时打开"编码的UI测试生成器",随时捕获控件,查看控件属性. 操作步骤: 1. 通过Visual Studio的"外部工具"菜单,添加快捷方式 2. 制定快捷方式的命令名称和路径 Visual Studio 2013的命令为:C:\Program

毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.io/picasso/ 我们在上篇OkHttp的时候说过这个Picasso,学名毕加索,是Square公司开源的一个Android图形缓存库,而且使用起来也是非常的简单,只要一行代码就轻松搞定了,你会问,为什么不介绍一下Glide?其实Glide我有时间也是会介绍的,刚好上篇我们用到了Picasso,

Android学习路线(二十二)运用Fragment构建动态UI——构建一个灵活的UI

先占个位置,下次翻译 :p When designing your application to support a wide range of screen sizes, you can reuse your fragments in different layout configurations to optimize the user experience based on the available screen space. For example, on a handset devi

Android学习路线(四)构建一个简单的UI

Android应用的图形化用户界面的构建使用的是View 和 ViewGroup 对象的层次嵌套. View 对象通常是UI部件,例如 buttons 或者 text fields ,而 ViewGroup 是用来定义它的子布局如何排布的容器,它通常是不可见的,例如一个网格或者一个垂直的列表. Android提供XML词汇与View或者ViewGroup的子类的对应,这样的话你就可以通过XML元素的层级嵌套来定义你的UI. 另一种布局 使用XML声明UI比在运行时代码中声明更有用处可以在很多地方

推荐一个iOS应用UI界面设计网站

定义和用法 <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!DOCTYPE> 声明不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令. 在 HTML 4.01 中,<!DOCTYPE> 声明引用 DTD,因为 HTML 4.01 基于 SGML.DTD 规定了标记语言的规则,这样浏览器才能正确地呈现内容. DOCTYPE   3种类型 HTML 4.01 Strict 该

自己动手设计并实现一个linux嵌入式UI框架(设计)

看了"自己动手设计并实现一个linux嵌入式UI框架"显然没有尽兴,因为还没有看到庐山真面目,那我今天继续,先来说说,我用到了哪些知识背景.如:C语言基础知识,尤其是指针.函数指针.内存分布,linux 基础知识.如消息队列.framebuffer.多线程.多线程同步.等,数据结构.算法(如链表.队列等),window .netframework 框架设计思想,设计模式如 mvc.观察者.单例.工厂等.知识点有点多,每个知识点有机的组合在一起,形成了一个知识网,构成了一个系统.以上提到