local UIView = class("UIView" , function() local scene = cc.Scene:create("UIView"); scene:setContentSize(app.mainScene:getContentSize()); scene:setAnchorPoint(cc.p(0,0)); return scene; end ) function UIView:ctor() local function onNodeEvent(node , eventType) if eventType == cc.NodeEvent.OnEnterTransitionDidFinish then print("进入" , self.class.__cname); self:onEnter() app:dispatchEvent({name = "enter" , view = self , className = self.class.__cname}); elseif eventType == cc.NodeEvent.OnExitTransitionDidStart then print("开始退出" , self.class.__cname); -- 这个是做view退出前的一些清空操作,修改这里的话最好找ship探讨下 self:OnExitTransitionDidStart() elseif eventType == cc.NodeEvent.OnExit then print("退出" , self.class.__cname); self:onExit() AllViews[self] = nil app:dispatchEvent({name = "exit" , view = self , className = self.class.__cname}); end end self:addNodeEventListener(onNodeEvent) -- 统计所有的View AllViews[self] = self -- 当前view里面等待窗口的引用计数 self.showWaitDialogCount = 0 -- 当前View里面显示透明蒙版的计数 self.transparencyMaskCount = 0 self.transparencyMask = nil -- 淡入动画开始阻止点击事件的次数 self.preventTouchByFadeIn = 0 -- fadeInBegin的时候设置成true,fadeInEnd之后设置为false self.isFadeIn = nil; end -- 淡入动画开始播放时触发一个事件 function UIView:fadeInBegin() print("淡入动画开始播放:" .. self.class.__cname) -- 设置状态 self.isFadeIn = true; -- 派发战场进入事件 app:dispatchEvent({name = "fadeInBegin" , view = self , className = self.class.__cname}); -- 如果有外部设置了阻止触摸事件则在淡入的过程中需要阻止 if self.class.__cname ~= "" and hasPreventTouchByFadeIn(self.class.__cname) then -- 显示透明蒙版 self:showTransparencyMask() self.preventTouchByFadeIn = self.preventTouchByFadeIn + 1 removePreventTouchByFadeIn(self.class.__cname) end end -- 淡入动画播放完毕时触发一个事件 function UIView:fadeInEnd() print("淡入动画播放完毕:" .. self.class.__cname) -- 设置状态 self.isFadeIn = false; if self.class.__cname ~= "" and self.preventTouchByFadeIn > 0 then while self.preventTouchByFadeIn > 0 do -- 隐藏透明蒙版 self:closeTransparencyMask() self.preventTouchByFadeIn = self.preventTouchByFadeIn - 1 end end -- 派发淡入动画结束事件 app:dispatchEvent({name = "fadeInEnd" , view = self , className = self.class.__cname}); end -- 淡出动画开始播放时 function UIView:fadeOutBegin() print("淡出动画开始播放:" .. self.class.__cname) -- 派发战场进入事件 app:dispatchEvent({name = "fadeOutBegin" , view = self , className = self.class.__cname}); end -- 显示模态对话框窗口,并不能关闭的,阻挡鼠标消息 function UIView:showWaitDialog(uiView, transparency, useGlobalFadeInOut) app:_showDialog(uiView, transparency, useGlobalFadeInOut, false , self); end -- 显示模态对话框窗口,并不能关闭的,阻挡鼠标消息 function UIView:showWaitUI(ui, transparency, useGlobalFadeInOut) local uiView = import("luaScript.Views.UIView"):new(); uiView.ui = ui; uiView:addChild(ui); app:_showDialog(uiView, transparency, useGlobalFadeInOut, false , self); return uiView; end -- 显示模态对话框窗口 function UIView:showDialog(uiView, transparency, useGlobalFadeInOut) app:_showDialog(uiView, transparency, useGlobalFadeInOut, true , self); end -- 显示模态对话框窗口,并不能关闭的,阻挡鼠标消息 function UIView:showUI(ui, transparency, useGlobalFadeInOut) local uiView = import("luaScript.Views.UIView"):new(); uiView.ui = ui; uiView:addChild(ui); app:_showDialog(uiView, transparency, useGlobalFadeInOut, true, self); return uiView; end -- 在自己里面显示一个透明的蒙版,阻挡一切的点击事件 function UIView:showTransparencyMask() -- 加到当前的view里面去 if not self.transparencyMask then local mask = loadUI("res/ui/ui_common/TransparencyMask.ui") self.transparencyMask = mask self:addChild(mask) mask:setWorldPosition(cc.vec3(0,0,0)) self.transparencyMaskCount = 1 else self.transparencyMaskCount = self.transparencyMaskCount + 1 end print("View[" .. self.class.__cname .. "]显示了阻挡触摸事件的透明蒙版,蒙版计数;" .. self.transparencyMaskCount) end -- 关闭透明的蒙版 function UIView:closeTransparencyMask() if self.transparencyMaskCount <= 0 and not self.transparencyMask then print("View[" .. self.class.__cname .. "]没有显示透明蒙版,不需要关闭") return end self.transparencyMaskCount = self.transparencyMaskCount - 1 print("View[" .. self.class.__cname .. "]关闭了阻挡触摸事件的透明蒙版,蒙版计数;" .. self.transparencyMaskCount) if self.transparencyMaskCount <= 0 then if not tolua.isnull(self.transparencyMask) then self.transparencyMask:removeFromParent() self.transparencyMask = nil end end end -- 清零引用计数,关闭透明的蒙版 function UIView:closeAllTransparencyMask() if self.transparencyMaskCount <= 0 and not self.transparencyMask then print("View[" .. self.class.__cname .. "]没有显示透明蒙版,不需要关闭") return end if not tolua.isnull(self.transparencyMask) then self.transparencyMask:removeFromParent() self.transparencyMask = nil self.transparencyMaskCount = 0; print("View[" .. self.class.__cname .. "]关闭了所有阻挡触摸事件的透明蒙版,蒙版计数;" .. self.transparencyMaskCount) end end -- 淡入动画 function UIView:fadeIn(fadeInEnd) if type(self.fadeInBegin) == "function" then self:fadeInBegin() end if self.ui and self.ui:hasClip("fadeIn") then local function inEnd() if fadeInEnd then fadeInEnd(); end if type(self.fadeInEnd) == "function" then self:fadeInEnd() end end self.ui:playClip("fadeIn", inEnd) -- 开始播放淡入动画了 if type(self.fadeInClipBegin) == "function" then self:fadeInClipBegin() end else if fadeInEnd then fadeInEnd(); end -- 没有动画直接回调 if type(self.fadeInEnd) == "function" then self:fadeInEnd() end end end -- 淡出动画 function UIView:fadeOut(fadeOutEnd) if type(self.fadeOutBegin) == "function" then self:fadeOutBegin() end if self.ui and self.ui:hasClip("fadeOut") then local function outEnd() if fadeOutEnd then fadeOutEnd(); end if type(self.fadeOutEnd) == "function" then self:fadeOutEnd() end end self.ui:playClip("fadeOut", outEnd) else if fadeOutEnd then fadeOutEnd(); end -- 没有动画直接回调 if type(self.fadeOutEnd) == "function" then self:fadeOutEnd() end end end function UIView:onEnter() end function UIView:OnExitTransitionDidStart() end function UIView:onExit() end return UIView;