MiniMessageView = MiniMessageView or BaseClass(BaseView) local MiniMessageView = MiniMessageView MiniMessageView.CACHE_MSG_COUNT = 15 function MiniMessageView:__init() self.base_file = "message" self.layout_file = "MiniMessageView" self.layer_name = "Top" self.destroy_imm = true self.use_background = false --全屏界面默认使用这个参数 self.mask_open_sound = true self.mask_close_sound = true --self.hide_maincancas = true --全屏界面需要放开隐藏主UI self.change_scene_close = false self.append_to_ctl_queue = false --是否要添加进界面堆栈 self.need_show_money = false --是否要显示顶部的金钱栏 self.all_msg_list = {} self.cache_item_list = Array.New() self.cur_item_list = {} self.real_index = 0 --所有创建过的item的数量 self.can_show = true self.screen_height = 2 * ScreenHeight / 5 - 20 self.load_callback = function () self:LoadSuccess() self:AddEvent() end self.open_callback = function ( ) self:OpenSuccess() end self.switch_callback = function(index) self:SwitchTab(index) end self.destroy_callback = function ( ) self:DestroySuccess() end end function MiniMessageView:Open( ) --self.data = data BaseView.Open(self) end function MiniMessageView:LoadSuccess() local nodes = { "item_con:obj", } self:GetChildren(nodes) end function MiniMessageView:AddEvent() local function call_back(objs) self.prefab_asset = objs[0] self:CreateCacheItem() end lua_resM:loadPrefab(self,"message","miniMessage", call_back) local event = function () self.all_msg_list = {} end self.scene_id = GlobalEventSystem:Bind(SceneEventType.OPEN_SCENE_LOAD_VIEW,event) local func = function () self.all_msg_list = {} end self.account_change_id = GlobalEventSystem:Bind(EventName.CHANGE_ACCOUNT,func) self.role_change_id = GlobalEventSystem:Bind(EventName.CHANGE_ROLE,func) end function MiniMessageView:OpenSuccess() self:UpdateView() self:StartResetTime() end function MiniMessageView:CreateCacheItem( ) for index = 0, MiniMessageView.CACHE_MSG_COUNT do local item = MessageItemNew.New(self.item_con,self.prefab_asset,nil,function(item) item:SetVisible(false) end) self.cache_item_list:PushBack(item) end end function MiniMessageView:UpdateView() local size = TableSize(self.all_msg_list) if size <= 0 then return else self:SetTop() end local real_index = self.real_index local function callback( item,index, real_index) self.all_msg_list[real_index] = nil item:SetVisible(false) item:Reset() self.cache_item_list:PushBack(item) self.cur_item_list[real_index] = nil end for index=1, real_index do local data = self.all_msg_list[index] if data then local item = self.cur_item_list[data.real_index] if not item then item = self.cache_item_list:PopFront() -- if not item then -- item = MessageItemNew.New(self.item_con,self.prefab_asset,nil) -- end if item then item:Reset()--不管是创建的还是拿缓存池的 都先重置 end end if item then item:SetData(data, self.real_index, data.real_index, callback) self.cur_item_list[data.real_index] = item else self.real_index = index break end end end self:MoveItemCon() end --移动整个con function MiniMessageView:MoveItemCon( ) local pos_y = (MessageItemNew.Height) * (self.real_index-1) - self.screen_height cc.ActionManager:getInstance():removeAllActionsFromTarget(self.item_con) SetAnchoredPositionY(self.item_con, pos_y) local moveup_action_time1 = 0.5 local function action_end_func() -- self.callback(self, self.index) end local callfun1 = cc.CallFunc.New(action_end_func) local pre_pos_x, pre_pos_y = GetAnchoredPosition(self.item_con) local moveAction1 = cc.MoveTo.createAnchoredType(moveup_action_time1, 0, pos_y + (MessageItemNew.Height), pre_pos_x, pre_pos_y) moveAction1 = cc.EaseCircleActionOut.New( moveAction1) local action = cc.Sequence.New(moveAction1,delayTime3, callfun1) cc.ActionManager:getInstance():addAction(action, self.item_con) end function MiniMessageView:StartResetTime( ) local function time_callback() if TableSize(self.cur_item_list) == 0 then self.real_index = 0 SetAnchoredPositionY(self.item_con, - self.screen_height) self:StopResetTime() end end SysInfoCtrl.Instance:SetFuncCallBack(time_callback, "MiniMessageView:StartResetTime") end function MiniMessageView:StopResetTime( ) SysInfoCtrl.Instance:DeleteFuncCallBack("MiniMessageView:StartResetTime") end --这里要置顶,避免有orderinlayer的界面挡住 function MiniMessageView:SetTop( ) UIDepth.SetUIDepth(self.gameObject,true,900) self:ResetUIZDepth() self:AddUIZDepth() --特殊处理,z轴和orderInLayer 乱了 SetLocalPositionZ(self.transform, GetLocalPositionZ(self.transform)-1000) end --新消息实时来添加 function MiniMessageView:AppendMessage(content) if not self.prefab_asset then return end self.real_index = self.real_index + 1 local data = { content = content, real_index = self.real_index } self.all_msg_list[self.real_index] = data self:StartResetTime() self:UpdateView() end function MiniMessageView:SetHide(bool) self.item_con_obj:SetActive(bool) end function MiniMessageView:DestroySuccess( ) if self.account_change_id then GlobalEventSystem:UnBind(self.account_change_id) self.account_change_id = nil end if self.role_change_id then GlobalEventSystem:UnBind(self.role_change_id) self.role_change_id = nil end if self.scene_id then GlobalEventSystem:UnBind(self.scene_id) self.scene_id = nil end for k,v in pairs(self.cur_item_list) do v:DeleteMe() v = nil end self.cur_item_list = {} local function callback( item ) item:DeleteMe() end self.cache_item_list:ForEach(callback) self.cache_item_list:Clear() end