Cocos2dx-lua ScrollView[三]高级篇

一.概述

本文缩写说明:sv = ScrollView, cell代表ScrollView的一个子节点

本文介绍sv的一种封装类库,来实现快速创建sv,有如下几个优点:

1.item的位置通过参数控制,提高开发效率

2.免去了调用sv的API,提高开发效率

3.分帧创建,提高性能

4.可通过参数控制,复用item类似tableview,提高性能

本文和上一篇Cocos2dx-lua ScrollView[二]进阶篇-CSDN博客

对比有一定相似之处,但也有较多不同,读者可仔细对比代码实现,详细品读,有所取舍和偏爱

二.效果演示

三.代码实现

3.1 说明

a.下面2个模块需要require

b.svCmn是比较复杂的,有必要阅读代码掌握运行原理

c.代码原封不动搬到工程里基本可以正常运行(当然哪里出了问题读者得会排查,本文基本喂饭喂到嘴里了)

d.svCmn经过上线项目验证,可放心使用,在项目中大量推广

3.2 辅助定时器模块:GlobalTimeTicket

GlobalTimeTicket = GlobalTimeTicket or {}
 
auto_id = auto_id or 0
function autoId()
    auto_id = auto_id + 1
    return auto_id
end
-- 获取单例
-- New和不New只是一层一层调用__init和__delete,对于单例没有影响
function GlobalTimeTicket:getInstance()
    if not self.is_init then 
        self.scheduler = cc.Director:getInstance():getScheduler()
        self.schedulers = {}
        self.is_init = true
        self.is_stop = nil
    end
    return self
end
 
-- 定时回调 通用版
-- call_back : function     回调函数    必填
-- interval  : int          时间间隔    默认1 秒
-- limit_time: int          限制次数    默认0 无限
-- with_name : any          定时器标识  默认自增id
-- 返回用于删除的标识
-- simple    : local id = GlobalTimeTicket:getInstance():add(fun) ; GlobalTimeTicket:getInstance():remove(id)
--           : GlobalTimeTicket:getInstance():add(fun, 0.1, 1)              -- 次数达到自动删除
--           : GlobalTimeTicket:getInstance():add(fun, 0.1, 3, "name")      
function GlobalTimeTicket:add(call_back, interval, limit_time, with_name)
    if self.is_stop then return end
    with_name = with_name or autoId()
    if nil == call_back or self.schedulers == nil or nil ~= self.schedulers[with_name] then return end    -- 已经有定义了,不能重复
 
    limit_time = limit_time or 0
    interval = interval or 1
    local schedul_hander = self.scheduler:scheduleScriptFunc(function(dt)
        if self.is_stop then return end
        if call_back ~= nil then
            if limit_time == 1 then 
                self:remove(with_name)
            elseif limit_time > 1 then 
                limit_time = limit_time - 1
            end
            call_back(dt)
        end
    end, interval, false)
    self.schedulers[with_name] = schedul_hander
    return with_name
end
 
-- 删除一个定时器
function GlobalTimeTicket:remove(with_name)
    if with_name == nil then return end
    local schedul_hander = self.schedulers[with_name] 
    if schedul_hander ~= nil then
        self.scheduler:unscheduleScriptEntry(schedul_hander)
        self.schedulers[with_name] = nil 
    end
end
 
-- 清除所有定时器
function GlobalTimeTicket:removeAll()
    for _, v in pairs(self.schedulers) do 
        self.scheduler:unscheduleScriptEntry(v)
    end
    self.schedulers = {}
end
 
function GlobalTimeTicket:hasTicket(with_name)
    local schedul_hander = self.schedulers[with_name] 
    if schedul_hander ~= nil then
        return true
    end
    return false
end
 
function GlobalTimeTicket:getSchedulers()
    return self.schedulers
end
 
-- 停止定时器
function GlobalTimeTicket:stop()
    self.is_stop = true
    self:removeAll()
end

3.3 sv封装模块:svCmn

--[[使用例子
    if not self.svCmn then
        local setting = {
            start_x = 18, space_x = 0,
            start_y = 26, space_y = 6,
            item_width = 686, item_height = 172,
            row = 1, col = 1,
            delay = 4, once_num = 1,
        }
        self.svCmn = svCmn.new(self.scr_con, cc.p(0,0) , ScrollViewDir.vertical, ScrollViewStartPos.top, self.scr_con:getContentSize(), setting, cc.p(0, 0))
        self.svCmn:registerScriptHandlerSingle(handler(self,self.createNewCell), ScrollViewFuncType.CreateNewCell)
        self.svCmn:registerScriptHandlerSingle(handler(self,self.numberOfCells), ScrollViewFuncType.NumberOfCells)
        self.svCmn:registerScriptHandlerSingle(handler(self,self.updateCellByIndex), ScrollViewFuncType.UpdateCellByIndex)
    end
    self.svCmn:reloadData()
]]--

--ScrollView的方法类型
ScrollViewFuncType = {
    UpdateCellByIndex = 1,      -- 更新cell体
    CreateNewCell  =  2,        -- 创建 新的cell 
    NumberOfCells = 3,          -- 返回 数据的数量
    OnCellTouched = 4,          -- 点击cell回调方法
}

svCmn = class("svCmn", function()
    return ccui.Layout:create()
end)

function svCmn:ctor(parent, pos, dir, start_pos, size, setting, ap)
    self.parent = parent
    self.pos = pos or cc.p(0, 0)
    self.dir = dir or ScrollViewDir.vertical
    self.start_pos = start_pos or ScrollViewStartPos.top
    self.size = size or cc.size(100, 100)
    self.ap = ap or cc.p(0, 0)

    self.allCellList = {}       --存放cell对象和其坐标,结构:{x, y, cell}, cell存在重复对象, 长度=cell总数量
    self.cacheList = {}         --保存所有实际创建的cell, 长度=cell最大显示数量
    self.activeCellIdx = {}     --保存每个位置的cell当前是否处于显示状态, 长度=cell总数量
    self.handler = {}           --回调方法
    self.time_show_index = 0    --到时间显示的索引
    self.is_first_init = true   --是否初始化

    self:analysisSetting(setting)
    self:createRootWnd()
end

--要求规定setting的所有变量 都应该在这里定义出来
function svCmn:analysisSetting(setting)
    self.setting        = setting or {}
    self.start_x        = self.setting.start_x or 0             -- 第一个单元的起点X
    self.end_x          = self.setting.end_x or self.start_x    -- 最后一个单元结束X间隔 如果是nil 默认 和 start_x一致
    self.start_y        = self.setting.start_y or 0             -- 第一个单元的起点Y
    self.end_y          = self.setting.end_y or self.start_y    -- 最后一个单元结束Y间隔 如果是nil 默认 和 start_y一致
    self.space_x        = self.setting.space_x or 3             -- 横向间隔空间
    self.space_y        = self.setting.space_y or 3             -- 竖向间隔空间
    self.item_width     = self.setting.item_width or 115        -- 单元的宽度
    self.item_height    = self.setting.item_height or 115       -- 单元的高度

    self.row            = self.setting.row or 5                 -- 行数,作用于水平方向的滚动
    self.col            = self.setting.col or 5                 -- 列数,作用于垂直方向的滚动
    self.delay          = 1 --self.setting.delay or 4           -- 创建延迟时间 强制改为1 
    self.once_num       = self.setting.once_num or 1            -- 每次创建的数量
    self.need_dynamic   = true  -- 默认是无限的
    self.checkovercallback = self.setting.checkovercallback     --滑动回调函数
    self.is_auto_scroll = setting.is_auto_scroll or false       --是否自动判断是否能滚动..个数小于一屏大小时候scroll 不能滚动

    --位置列表 
    self.position_data_list = self.setting.position_data_list

    --固定容器大小 如果有值.将不运算容器大小
    self.container_width = setting.container_width
    self.container_height = setting.container_height

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/495996.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp h5 引入阿里云一键登录

参考官方文档: 如何将H5页面接入网页端SDK并一键登录_号码认证服务(PNVS)-阿里云帮助中心 本文主要分享uniapp 对SDK依赖文件的引入 采用npm包引入的方法: 1.下载 // 下载npm资源并添加依赖到package.json npm i aliyun_numberauthsdk_web -S tips: 查看package.json文件,确…

Java毕业设计-基于springboot开发的疫情防控期间外出务工人员信息管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、后台登录2.1管理员功能2.2用户功能2.3采集员功能2.4分析员功能 四、毕设内容和源代码获取总结 Java毕业设计-基…

MySql实战--事务到底是隔离的还是不隔离的

第3篇文章和你讲事务隔离级别的时候提到过,如果是可重复读隔离级别,事务T启动的时候会创建一个视图read-view,之后事务T执行期间,即使有其他事务修改了数据,事务T看到的仍然跟在启动时看到的一样。也就是说&#xff0c…

MySQL安装和配置(超详细)

👨‍💻作者简介:👨🏻‍🎓告别,今天 📔高质量专栏 :☕java趣味之旅 欢迎🙏点赞🗣️评论📥收藏💓关注 💖衷心的希…

为什么做秒真问答?秒真问答营销的价值分析

近来,今日头条对部分业务做出调整。一方面是将“头条百科”升级为“抖音百科”,通过“抖音百科”这个新品牌,更好的为今日头条和抖音的内容场景服务。另外一方面则是,推出全新的问答业务“秒真问答”,目前已经在抖音和…

apisix创建https

总结了下apisix 使用https 的问题和方法 1、apisix 默认https 端口是9443 2、apisix 需要上传证书后才可以使用https 否二curl测试会报错 SSL routines:CONNECT_CR_SRVR_HELLO 3、apisix 上传证书方法 我是使用的自签名证书,注意自签名证书的Common Name 要写你…

WPF 多路绑定、值转换器ValueConvert、数据校验

值转换器 valueconvert 使用ValueConverter需要实现IValueConverter接口,其内部有两个方法,Convert和ConvertBack。我们在使用Binding绑定数据的时候,当遇到源属性和目标控件需要的类型不一致的,就可以使用ValueConverter&#xf…

Tickeys for Mac:让每一次敲击都充满乐趣,提升打字体验新高度!

Tickeys for Mac 是一款为 macOS 设计的虚拟键盘音效生成器。它通过模拟机械键盘的声音,为打字和输入操作增添了音效反馈,让用户在使用电脑时感受到更加真实的键盘反馈体验。用户可以根据个人喜好选择不同类型的键盘声音和音效设置,让键盘操作…

嗨购模式:绿色积分引领消费新潮流,实现增值共赢新篇章

随着绿色消费观念深入人心,绿色积分作为新的消费激励方式受到了广大消费者的热烈追捧。在众多消费模式中,嗨购模式凭借其独特的绿色积分融合策略,让消费者在享受绿色消费的同时,也能获得更多实惠与额外收益。 传统的全返机制虽然为…

Docker 部署 Elasticsearch-Filebeat-Kibana

目录 一、简介 1.Elasticsearch: 2.Filebeat: 3.Kibana: 二、工作流程 三、部署 1.创建docker网络 2.启动 elasticsearch 容器 3.创建 kibana 容器 4.客户端安装日志采集器filebeat (1)docker安装 (2)rpm安装 四、访…

新品发布|灵雀云重磅推出大模型 LLMOps 平台

自即日起,灵雀云正式推出大模型 LLMOps 平台 Alauda Machine Learning (简称 AML),AML在整合传统 MLOps 解决方案的基础之上,为大模型/大语言模型场景提供更强大、更易用的功能。灵雀云意在将AML打造成全面覆盖传统 ML…

《YOLOv9魔术师专栏》专栏介绍 专栏目录

《YOLOv9魔术师专栏》将从以下各个方向进行创新(更新日期24.3.28): 【原创自研模块】【多组合点优化】【注意力机制】【卷积魔改】【block&多尺度融合结合】【损失&IOU优化】【上下采样优化 】【SPPELAN & RepNCSPELAN4优化】【…

Linux系统使用Docker部署Portainer结合内网穿透实现远程管理容器和镜像

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PMO活动︱2024第十三届中国PMO大会将于5月在京召开

PMO站在企业高度进行组织级项目管理,工作虽然千头万绪但首当其冲的无疑是在企业中建立统一的、标准化的项目管理方法体系,“无规矩不成方圆”,根据项目管理行业标准结合企业实际情况制定一整套适合本企业的项目管理规范制度,这是P…

如何使用Excel创建一个物品采购表

在企业的日常运营中,物品采购是一个常见且重要的活动。有效的采购管理不仅可以确保企业及时获得所需物资,还可以控制成本、提高效率。Microsoft Excel是一个功能强大的工具,它可以帮助我们创建和管理物品采购表。本文将详细介绍如何使用Excel…

如何制定公平、客观的考核标准,避免主观偏见和人情因素的影响?

在企业管理中,考核标准的制定是确保员工绩效评价公正、客观的关键环节。然而,由于主观偏见和人情因素的影响,很多企业在考核过程中往往难以做到公平、公正。本文将探讨如何制定公平、客观的考核标准,以最大程度地减少主观偏见和人…

【Frida】【Android】04_Objection安装和使用

🛫 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

在点集的新知识面前百年集论不堪一击

黄小宁 与x∈R相异(等)的实数均可表为yxδ(增量δ可0也可≠0),因各实数的绝对值都可是表示长度的数故各实数都可是数轴上点的坐标,于是x∈R变换为实数yxδ的几何意义可是:一维空间“管道”g内R…

ICP Hacker House 邀你共赴 IC 生态项目开发新风口

为了更好地探索区块链技术前沿,体验作为全面智能合约云平台的互联网计算机(Internet Computer Protocol),将数据、内容、计算和用户体验全部托管于链上,IC 生态致力于推动去中心化互联网的深度发展,并将更安…

为何云安全产品需区分四层与七层协议攻击:深入理解与应对策略

引言 随着云计算技术的发展和广泛应用,云安全产品的精细化与智能化需求日益凸显。其中,针对网络攻击的防御措施往往基于对传输协议层面的理解和处理,特别是四层(传输层)和七层(应用层)协议攻击…