• Cocos2dx-lua ScrollView[二]进阶篇


    一.概述

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

    如果对sv熟系程度还不够,请阅读基础篇:

    Cocos2dx-lua ScrollView[一]基础篇-CSDN博客

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

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

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

    3.分帧创建,提高性能

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

    二.效果演示

    2.1 item不复用

    2.2 item复用

    三.代码实现

    3.1 说明

    a.下面2个模块需要require

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

    c.item数量较多时才有必要用need_dynamic参数

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

    3.2 辅助定时器模块:GlobalTimeTicket

    1. GlobalTimeTicket = GlobalTimeTicket or {}
    2. auto_id = auto_id or 0
    3. function autoId()
    4. auto_id = auto_id + 1
    5. return auto_id
    6. end
    7. -- 获取单例
    8. -- New和不New只是一层一层调用__init和__delete,对于单例没有影响
    9. function GlobalTimeTicket:getInstance()
    10. if not self.is_init then
    11. self.scheduler = cc.Director:getInstance():getScheduler()
    12. self.schedulers = {}
    13. self.is_init = true
    14. self.is_stop = nil
    15. end
    16. return self
    17. end
    18. -- 定时回调 通用版
    19. -- call_back : function 回调函数 必填
    20. -- interval : int 时间间隔 默认1 秒
    21. -- limit_time: int 限制次数 默认0 无限
    22. -- with_name : any 定时器标识 默认自增id
    23. -- 返回用于删除的标识
    24. -- simple : local id = GlobalTimeTicket:getInstance():add(fun) ; GlobalTimeTicket:getInstance():remove(id)
    25. -- : GlobalTimeTicket:getInstance():add(fun, 0.1, 1) -- 次数达到自动删除
    26. -- : GlobalTimeTicket:getInstance():add(fun, 0.1, 3, "name")
    27. function GlobalTimeTicket:add(call_back, interval, limit_time, with_name)
    28. if self.is_stop then return end
    29. with_name = with_name or autoId()
    30. if nil == call_back or self.schedulers == nil or nil ~= self.schedulers[with_name] then return end -- 已经有定义了,不能重复
    31. limit_time = limit_time or 0
    32. interval = interval or 1
    33. local schedul_hander = self.scheduler:scheduleScriptFunc(function(dt)
    34. if self.is_stop then return end
    35. if call_back ~= nil then
    36. if limit_time == 1 then
    37. self:remove(with_name)
    38. elseif limit_time > 1 then
    39. limit_time = limit_time - 1
    40. end
    41. call_back(dt)
    42. end
    43. end, interval, false)
    44. self.schedulers[with_name] = schedul_hander
    45. return with_name
    46. end
    47. -- 删除一个定时器
    48. function GlobalTimeTicket:remove(with_name)
    49. if with_name == nil then return end
    50. local schedul_hander = self.schedulers[with_name]
    51. if schedul_hander ~= nil then
    52. self.scheduler:unscheduleScriptEntry(schedul_hander)
    53. self.schedulers[with_name] = nil
    54. end
    55. end
    56. -- 清除所有定时器
    57. function GlobalTimeTicket:removeAll()
    58. for _, v in pairs(self.schedulers) do
    59. self.scheduler:unscheduleScriptEntry(v)
    60. end
    61. self.schedulers = {}
    62. end
    63. function GlobalTimeTicket:hasTicket(with_name)
    64. local schedul_hander = self.schedulers[with_name]
    65. if schedul_hander ~= nil then
    66. return true
    67. end
    68. return false
    69. end
    70. function GlobalTimeTicket:getSchedulers()
    71. return self.schedulers
    72. end
    73. -- 停止定时器
    74. function GlobalTimeTicket:stop()
    75. self.is_stop = true
    76. self:removeAll()
    77. end

    3.3 sv封装模块:svUtil

    1. ----------------------------------------------------------------------------------- example -----------------------------------------------------------------------------------
    2. --[[
    3. self.scr_lyt = AM.getNode(self.midPanel, "scr_lyt")
    4. local setting = {
    5. item_class = moonActivityPanelItem,
    6. start_x = 24.5, space_x = 0,
    7. start_y = 5, space_y = 10,
    8. item_width = 621, item_height = 126,
    9. row = 0, col = 1,
    10. --need_dynamic = true
    11. }
    12. self.item_scrollview = svUtil.new(self.scr_lyt, cc.p(0,0) , ScrollViewDir.vertical, ScrollViewStartPos.top, self.scr_lyt:getContentSize(), setting)
    13. local svData = {}
    14. self.item_scrollview:setData(svData)
    15. ]]
    16. ----------------------------------------------------------------------------------- example -----------------------------------------------------------------------------------
    17. display.DEFAULT_FPS = 60
    18. ScrollViewDir = ScrollViewDir or {
    19. vertical = 1,
    20. horizontal = 2,
    21. }
    22. ScrollViewStartPos = ScrollViewStartPos or {
    23. top = 1,
    24. bottom = 2
    25. }
    26. function tableLen(table)
    27. local len = 0
    28. if table then
    29. for _ in pairs(table) do
    30. len = len + 1
    31. end
    32. end
    33. return len
    34. end
    35. function createScrollView(width,height,x,y,parent_wnd,type)
    36. local scroll_view = ccui.ScrollView:create()
    37. scroll_view:setBounceEnabled(true)
    38. scroll_view:setScrollBarEnabled(false)
    39. if type == ccui.ScrollViewDir.horizontal then
    40. scroll_view:setDirection(ccui.ScrollViewDir.horizontal)
    41. else
    42. scroll_view:setDirection(ccui.ScrollViewDir.vertical)
    43. end
    44. scroll_view:setTouchEnabled(true)
    45. scroll_view:setContentSize(cc.size(width, height))
    46. scroll_view:setInnerContainerSize(scroll_view:getContentSize())
    47. scroll_view:setPosition(cc.p(x, y))
    48. if not tolua.isnull(parent_wnd) then
    49. parent_wnd:addChild(scroll_view)
    50. end
    51. return scroll_view
    52. end
    53. svUtil = class("svUtil", function()
    54. return ccui.Layout:create()
    55. end)
    56. function svUtil:ctor(parent, pos, dir, start_pos, size, setting, ap
  • 相关阅读:
    线程终止的 4 种方式
    <C++>快速掌握set 容器|去重的底层原因|使用仿函数定义排序规则
    国内大型语言模型(LLM)的研发及突破性应用
    CNN详细讲解
    金仓数据库 KingbaseGIS 使用手册(11. KGIS函数列表)
    macOS Sonoma 桌面小工具活学活用!
    通过HatchBush对象的()属性可设置HatchBush对象的阴影样式。
    docker全家桶(基本命令、dockerhub、docker-compose)
    Spring cloud alibaba实战
    场景应用:Spring容器是一个什么样的概念?有什么作用?应用上下文呢?
  • 原文地址:https://blog.csdn.net/ellis1970/article/details/136612442