|
|
-
- BaseItem = BaseItem or BaseClass(UIPartical)
-
- local BaseItem = BaseItem
- local LuaViewManager = LuaViewManager
- local lua_viewM = lua_viewM
- local GetChildTransforms = GetChildTransforms
- local GetChildGameObjects = GetChildGameObjects
- local GetChildImages = GetChildImages
- local GetChildTexts = GetChildTexts
- local newObject = newObject
- BaseItem.Class_Type = "BaseItem"
-
- function BaseItem:__init(parent_wnd,prefab_asset,layer_name)
- self.parent_wnd = parent_wnd or false -- 父容器
- self.prefab_asset = prefab_asset or false --预制体 如果有传进来就直接通过预制体创建对象 免去加载预制体的过程
- self.layer_name = layer_name or false --需要挂接特效的时候 必须设置
- end
-
- --属性用途基本和baseview一致
- function BaseItem:__defineVar()
- return {
- _class_type = self,
- _iid = _in_obj_ins_id,
- _use_delete_method = false,
- base_file = nil,
- layout_file = nil,
- parent_wnd = nil,
- is_delay_callback = false,
- Load_callback = nil , -- 加载的回调函数,必须由子类重写
- is_loaded = nil,
- visible = -1, --等待加载完回调的visible状态
- use_local_view = false,
- position = false,
- anchoredPosition = false,
- cache_findChild = nil,
- prefab_asset = nil,
- need_refreshData = nil,
- gameObject = nil,
- transform = nil,
- is_guide_module = false,--是否是新手引导模块
- ReOpen_callback = nil, --重新打开界面,刷新事件
- is_hide_delete_effect = true, --隐藏时删除特效
- hide_clear_role_model = true, --隐藏时删除模型
- is_imm_show = true, --立即显示;有问题的界面需要设为false,就会等到加载完再显示
- full_screen = false, --全屏模式
- ani_right = false, --右侧动画
- ani_left = false, --左侧动画
- adjust_mid = false, --中间布局调整
- ani_list = false,
-
- move_node_list = false, --移动到背景节点列表
- cache_move_node_list = false,--缓存移动到背景节点列表
- parent_view_target = false, --item所在界面
- }
- end
-
- function BaseItem:__delete()
- self:RemoveUIFromBack()
- self:Destroy()
- self:AfterDestroy()
- end
-
- function BaseItem:Destroy()
- if self.gameObject == nil then return end
-
- if self.transform and not IsNull(self.transform) and self.transform.name then
- GlobalEventSystem:Fire(EventName.BASE_ITEM_DELETE, self.transform.name,self.layout_file)
- end
-
- if self._base_delay_load_id then
- LuaViewManager:getInstance():RemoveDelayQueue(self._base_delay_load_id)
- self._base_delay_load_id = nil
- end
-
- if self.trigger_guide_id then
- EventSystem.UnBind(GlobalEventSystem, self.trigger_guide_id)
- self.trigger_guide_id = false
- end
-
- UI.BindEventComp.UnBindAll(self)
- if self.action_nodes then
- for k,v in pairs(self.action_nodes) do
- cc.ActionManager:getInstance():removeAllActionsFromTarget(v)
- end
- self.action_nodes = nil
- end
-
- if self.effect_nodes then
- for k,v in pairs(self.effect_nodes) do
- self:ClearUIEffect(v)
- end
- end
-
- if self.autoDeleteList then
- for i,v in ipairs(self.autoDeleteList) do
- if v ~= nil then
- v:DeleteMe()
- end
- end
- self.autoDeleteList = nil
- end
-
- if self.orientation_change_id then
- EventSystem.UnBind(GlobalEventSystem,self.orientation_change_id)
- self.orientation_change_id = nil
- end
-
- LuaViewManager.ClearItem(lua_viewM, self.gameObject)
-
- self.parent_wnd = nil
- self.gameObject = nil
- self.transform = nil
- self.cache_findChild = nil
- self.prefab_asset = nil
- self.is_loaded = false
- self.need_refreshData = false
- self.parent_view_target = false
- self.cache_move_node_list = false
- self:AfterDestroy()
- end
-
- --[[
- 获取子对象的transform
- 特别注意此方法是从根节点开始搜寻子对象 所以要写全路径 比如:"input/Text"
- ]]
- function BaseItem:GetChild(name)
- if self.cache_findChild and self.transform then
- return self.cache_findChild(self.transform,name)
- end
- end
-
- function BaseItem:GetChildComponent(name,com)
- return self:GetChild(name):GetComponent(com)
- end
-
- --获取多个孩子transform
- function BaseItem:GetChildTransforms(names)
- return GetChildTransforms(self.transform, names)
- end
-
- --获取多个孩子go
- function BaseItem:GetChildGameObjects(names)
- return GetChildGameObjects(self.transform, names)
- end
-
- --获取多个孩子image
- function BaseItem:GetChildImages(names)
- return GetChildImages(self.transform, names)
- end
-
- --获取多个孩子text
- function BaseItem:GetChildTexts(names)
- return GetChildTexts(self.transform, names)
- end
-
- function BaseItem:Load()
- if not self.parent_wnd then
- print ("error parent_wnd is Null")
- return
- end
-
- if self.gameObject then
- return
- end
- if self.prefab_asset and tostring(self.prefab_asset) ~= "null" then
- local go = newObject(self.prefab_asset)
- go.name = self.layout_file
- self:DoCreateItemIndeed(go)
- else
- local res_load_finish = function(obj)
- assert(obj~=nil, "BaseItem:Load failed:cannot find basefile : "..self.base_file.." layout:"..self.layout_file)
- self:DoCreateItemIndeed(obj)
- end
- self.is_loaded = false
- LuaViewManager.LoadItem(lua_viewM, self,self.base_file, self.layout_file, res_load_finish)
- end
- end
-
- function BaseItem:DoCreateItemIndeed(obj)
- self.gameObject = obj
- if self._use_delete_method then
- self:Destroy()
- return
- end
-
- if self.is_imm_show == false then
- self.gameObject:SetActive(false) --先调一次隐藏 避免显示有问题
- end
- self.transform = obj.transform
- self.cache_findChild = self.transform.Find
-
- self.transform:SetParent(self.parent_wnd)
- SetLocalScale(self.transform)
- SetLocalPosition(self.transform)
- self:InitViewAnimation()
-
- local function onLoad()
- if not IsNull(self.gameObject) and not self._use_delete_method then
- self.gameObject:SetActive(true)
- self.is_loaded = true
- self:SetRotation(0,0,0)--配合SetVisible优化用的,防止加载慢引起的显示错误
- self:BeforeLoad()
- if self.Load_callback then
- self:Load_callback()
- else
- LogError(self.layout_file ..":Load_callback must be override!")
- end
- if self.visible ~= -1 then
- self:SetVisible(self.visible, self.cache_force_hide)
- end
-
- if self.position then
- self:SetPosition(self.position.x,self.position.y)
- self.position = false
- end
-
- if self.anchoredPosition then
- self:SetAnchoredPosition(self.anchoredPosition.x,self.anchoredPosition.y)
- self.anchoredPosition = false
- end
-
- if self.scale then
- self:SetScale(self.scale)
- self.scale = false
- end
-
- if self.full_screen then
- local function onOrientationChange( )
- self:SetIpxMode()
- end
- if not self.orientation_change_id then
- self.orientation_change_id = GlobalEventSystem:Bind(EventName.ORIENTATION_DID_CHANGE, onOrientationChange)
- end
- end
-
- if self.gameObject_name then
- self:SetGameObjectName(self.gameObject_name)
- end
- self:DoOpenAni()
- end
- end
-
- if self.is_delay_callback then
- if self._base_delay_load_id then
- LuaViewManager.RemoveDelayQueue(lua_viewM, self._base_delay_load_id)
- self._base_delay_load_id = false
- end
- self._base_delay_load_id = LuaViewManager.AddDelayQueue(lua_viewM, onLoad)
- else
- onLoad()
- end
- end
-
- function BaseItem:SetVisible(state, force_hide)
- if self.is_loaded then
- self:SetBackUIVisible(state)
- if force_hide then
- --部分确实需要使用SetActive的
- if type(state) == "boolean" and force_hide and self.gameObject.activeSelf ~= state then
- if state and rawget(self, "cache_change_rotation") then
- self:SetRotation(0,0,0)
- end
- self.gameObject:SetActive(state)
- end
- else
- --旋转角度代替显示隐藏减少批次
- -------------------------
- if type(state) == "boolean" and state == true then
- self:SetRotation(0,0,0)
- if self.gameObject.activeSelf ~= true then
- self.gameObject:SetActive(true)
- end
- else
- self.cache_change_rotation = true
- self:SetRotation(90,90,0)
- end
- end
-
- if state == false then
- --隐藏的时候自动删掉挂接的模型和特效,需要在对应ITEM的ReOpen_callback后再创建
- if self.hide_clear_role_model then
- lua_resM:clearRoleMode(self)
- end
- if self.is_hide_delete_effect then
- self:ClearAllEffect()
- self:ResetUIZDepth()
- end
- elseif state == true and self.visible == false then
- if self.ReOpen_callback then
- self:ReOpen_callback()
- end
- end
- self.visible = state
- self.cache_force_hide = force_hide
- else
- self.visible = state
- self.cache_force_hide = force_hide
- end
- end
- function BaseItem:GetVisible()
- if self.is_loaded then
- return self.gameObject.activeSelf
- else
- return false
- end
- end
-
- function BaseItem:SetPosition(x, y)
- if self.is_loaded then
- SetLocalPosition(self.transform, x, y, 0)
- else
- self.position = Vector3(x,y,0)
- end
- end
-
- function BaseItem:GetPosition()
- if self.is_loaded then
- return self.transform.localPosition
- else
- return self.position or Vector3.zero
- end
- end
-
- function BaseItem:SetAnchoredPosition(x, y)
- if self.is_loaded then
- SetAnchoredPosition(self.transform,x,y)
- else
- self.anchoredPosition = Vector2(x,y)
- end
- end
-
- function BaseItem:GetAnchoredPosition()
- if self.is_loaded then
- return self.transform.anchoredPosition
- else
- return self.anchoredPosition or Vector2.zero
- end
- end
-
- function BaseItem:SetScale(scale)
- if self.is_loaded then
- SetLocalScale(self.transform, scale)
- else
- self.scale = scale
- end
- end
-
- function BaseItem:SetRotation(x,y,z)
- if self.is_loaded then
- self.transform.localRotation = Quaternion.Euler(x, y, z)
- end
- end
-
- function BaseItem:SetGameObjectName(name)
- if self.is_loaded then
- self.transform.name = name
- else
- self.gameObject_name = name
- end
- end
-
- function BaseItem:GetGameObjectName()
- if self.is_loaded then
- return self.transform.name
- else
- return self.gameObject_name or ""
- end
- end
-
- function BaseItem:GetChildren( names )
- GetChildren(self, names)
- end
-
- function BaseItem:GetSiblingIndex( )
- if self.is_loaded then
- self.transform:GetSiblingIndex()
- end
- end
-
- function BaseItem:SetSiblingIndex( value )
- if self.is_loaded then
- self.sibling_index = value or 0
- if self.sibling_index == 0 then
- self.transform:SetAsFirstSibling()
- else
- self.transform:SetSiblingIndex(self.sibling_index)
- end
- else
- self.sibling_index = value
- end
- end
-
- -- 显示子窗口
- function BaseItem:PopUpChild(win)
- if win then
- if self.popChild ~= nil and self.popChild ~= win then
- self.popChild:SetVisible(false, true)
- end
- self.popChild = win
- self.popChild:SetVisible(true, true)
- end
- end
-
- --移出屏幕(隐藏,用于频繁调用显示隐藏的对象,减少setActive的调用次数)
- function BaseItem:MoveOutOfScreen( transform )
- transform = transform or self.transform
- if transform then
- self.base_move_from_pos_y = self.base_move_from_pos_y or GetLocalPositionY(transform)
- SetLocalPositionY(transform, -99999)
- end
- end
-
- --移回屏幕(显示,用于频繁调用显示隐藏的对象,减少setActive的调用次数)
- function BaseItem:MoveInToScreen( transform )
- transform = transform or self.transform
- if transform and self.base_move_from_pos_y then
- SetLocalPositionY(transform, self.base_move_from_pos_y)
- self.base_move_from_pos_y = false
- end
- end
-
- --关闭界面时销毁该节点
- function BaseItem:AutoDelete( deleteNode )
- self.autoDeleteList = self.autoDeleteList or {}
- table.insert(self.autoDeleteList, deleteNode)
- end
-
- --自销毁事件
- function BaseItem:BindEvent( bindDispather, eventName, handleFunc )
- return UI.BindEventComp.BindEvent(self, bindDispather, eventName, handleFunc)
- end
-
- --自销毁节点
- function BaseItem:CreateItem( class_name, parent, layer_name, ... )
- if class_name and parent then
- local item = class_name.New(parent, nil, layer_name, ... )
- self:AutoDelete( item )
- return item
- end
- end
-
- --自销毁动作
- function BaseItem:AddAction( action, node )
- self.action_nodes = self.action_nodes or {}
- self.action_nodes[node] = node
- --table.insert(self.action_nodes, node)
- cc.ActionManager:getInstance():addAction(action, node)
- end
-
- --自销毁特效
- function BaseItem:CreateUIEffect( config )
- if not config or not config.uiTranform then return end
- self.effect_nodes = self.effect_nodes or {}
- self:AddUIEffectConfig( config )
- table.insert(self.effect_nodes, config.uiTranform)
- end
-
- --播放界面入场动画
- function BaseItem:DoOpenAni(tab_id)
- tab_id = tab_id or 1
- self.ani_list = self.ani_list or {}
- if not self.is_loaded or self.ani_list[tab_id] then return end
- self.ani_list[tab_id] = true
- self:DoOpenViewAnimation()
- end
-
- function BaseItem:InitViewAnimation()
- if self.full_screen or self.ani_left or self.ani_right then
- --处理刘海屏的位移偏移
- local width, offset = self:GetIpxOffset()
- --右侧
- self.ani_right_trans = self:GetChild("right")
- if self.ani_right_trans then
- self.ani_right_obj = self:GetChild("right").gameObject
- self.old_ani_right_pos = self.ani_right_trans.anchoredPosition
- if self.ani_right and ClientConfig.view_ani_mode == true then
- SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + 600, self.old_ani_right_pos.y)
- else
- SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + offset, self.old_ani_right_pos.y)
- end
- end
- --左侧
- self.ani_left_trans = self:GetChild("left")
- if self.ani_left_trans then
- self.ani_left_obj = self:GetChild("left").gameObject
- self.old_ani_left_pos = self.ani_left_trans.anchoredPosition
- if self.ani_left and ClientConfig.view_ani_mode == true then
- SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x - 600 , self.old_ani_left_pos.y)
- else
- SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + offset , self.old_ani_left_pos.y)
- end
- end
- --中间
- self:ResetMidNode()
-
- --设置界面大小
- local MaxScreenWidth = math.min(SrcScreenWidth - width, 1560 - width)
- local rt = self.gameObject:GetComponent("RectTransform")
- rt.sizeDelta = Vector2(MaxScreenWidth, ScreenHeight)
-
- end
- end
-
- --处理界面动画
- function BaseItem:DoOpenViewAnimation()
- local width, offset = self:GetIpxOffset()
- if self.ani_right and self.ani_right_trans and ClientConfig.view_ani_mode == true then
- cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_right_trans)
- SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + self.ani_right - offset, self.old_ani_right_pos.y)
- local moveActionRight = cc.MoveTo.createAnchoredType(1, self.old_ani_right_pos.x - offset, self.ani_right_trans.anchoredPosition.y)
- moveActionRight = cc.EaseExponentialOut.New(moveActionRight)
- self:AddAction(moveActionRight, self.ani_right_trans)
- end
-
- if self.ani_left and self.ani_left_trans and ClientConfig.view_ani_mode == true then
- cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_left_trans)
- SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + self.ani_left + offset, self.old_ani_left_pos.y)
- local moveActionLeft = cc.MoveTo.createAnchoredType(1, self.old_ani_left_pos.x + offset, self.ani_left_trans.anchoredPosition.y)
- moveActionLeft = cc.EaseExponentialOut.New(moveActionLeft)
- self:AddAction(moveActionLeft, self.ani_left_trans)
- end
- end
-
- --获取刘海屏位移
- function BaseItem:GetIpxOffset()
- local width, offset = 0, 0
- if ClientConfig.iphone_x_offset_left ~= 0 then
- offset = ClientConfig.iphone_x_offset_left/2
- width = ClientConfig.iphone_x_offset_left
- elseif ClientConfig.iphone_x_offset_right then
- offset = -ClientConfig.iphone_x_offset_right/2
- width = ClientConfig.iphone_x_offset_right
- end
- return width, offset
- end
-
- --处理中间节点
- function BaseItem:ResetMidNode()
- if self.adjust_mid then
- local width, offset = self:GetIpxOffset()
- local MaxScreenWidth = math.min(SrcScreenWidth - width, 1560 - width)
- self.mid_trans = self:GetChild("mid")
- if self.mid_trans then
- self.adjust_mid.left = self.adjust_mid.left or 0
- self.adjust_mid.right = self.adjust_mid.right or 0
- local x = MaxScreenWidth - self.adjust_mid.left - self.adjust_mid.right
- x = x / 2
- SetAnchoredPosition(self.mid_trans, - (MaxScreenWidth / 2) + self.adjust_mid.left + x + offset, self.mid_trans.anchoredPosition.y)
- end
- end
- end
-
- --处理刘海屏,旋转屏幕
- function BaseItem:SetIpxMode()
- self:ResetMidNode()
-
- local width, offset = self:GetIpxOffset()
- if self.ani_right_trans then
- cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_right_trans)
- SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + offset, self.old_ani_right_pos.y)
- end
-
- if self.ani_left_trans then
- cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_left_trans)
- SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + offset, self.old_ani_left_pos.y)
- end
- end
-
-
- --把界面的UI节点移动到背景层
- function BaseItem:MoveUIToBack(...)
- self.move_node_list = self.move_node_list or {}
- local parms = {...}
-
- if not self.parent_view_target then
- self.cache_move_node_list = self.cache_move_node_list or {}
- table.insert(self.cache_move_node_list, parms)
- return
- end
-
- local node = parms[1]
- local args = parms[2]
- local camera_args = parms[3]
- local activity_args = parms[4]
-
- local targt_view = self.parent_view_target
- if node then
-
- local t = {node = node, args = args, parent = node.transform.parent, sibling_idx = node.transform:GetSiblingIndex()}
- table.insert(self.move_node_list, t)
- LuaViewManager:getInstance():ShowBackData({
- target = targt_view,
- node_list ={[1] = t},
- camera_args = camera_args,
- activity = activity_args,
- })
- end
- end
-
-
- --把界面的UI节点从背景层中移除
- function BaseItem:RemoveUIFromBack()
- self.move_node_list = self.move_node_list or {}
- if #self.move_node_list > 0 then
- LuaViewManager:getInstance():HideBackData(self)
- end
- end
-
- --根据界面状态显示隐藏在背景层中的UI
- function BaseItem:SetBackUIVisible(state, from_view)
- if self.move_node_list then
- for k,v in pairs(self.move_node_list) do
- if from_view then
- if state then
- if v.is_hide_form_view then
- v.is_hide_form_view = nil
- v.node.gameObject:SetActive(state)
- end
- else
- if v.node.gameObject.activeSelf then
- v.is_hide_form_view = true
- v.node.gameObject:SetActive(state)
- end
- end
- else
- v.node.gameObject:SetActive(state)
- end
- end
- end
- end
-
- function BaseItem:AppendToBackContainer(parent_view)
- if parent_view then
- self.parent_view_target = parent_view
- parent_view:AppendToBackContainer(self)
- if self.cache_move_node_list then
- for i,v in ipairs(self.cache_move_node_list) do
- self:MoveUIToBack(unpack(v))
- end
- self.cache_move_node_list = false
- end
- end
- end
|