• Cocos2dx-lua ScrollView[一]基础篇


    一.ScrollView概述

    cocos游戏中ScrollView控件大量使用,95%以上的项目都会使用ScrollView,个别游戏可能全部使用翻页的滑动效果。如果想要精通Cocos的UI开发,精通ScrollView控件非常关键,因此对ScrollView的使用进行总结很有必要。

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

    二.ScrollView的创建

    2.1 在Cocos Studio中创建

    将滚动容器组件拖动至布局视图中,默认的显示如下

    有必要把sv涉及到的两部分区域的概念进行说明,在实际应用时经常会调用setContentSize和setInnerContainerSize来设置可视区域和滚动区域,在cocos studio中把裁切内容选项取消勾选(默认)时会显示出滚动区域

    接下来修改sv的属性,有必要说明的部分见下图

    2.2 代码创建sv

    1. self.sv = ccui.ScrollView:create()
    2. self.sv:setContentSize(cc.size(670, 595))
    3. self.sv:setInnerContainerSize(cc.size(670, 595))
    4. self.sv:setPosition(270,27)
    5. self.midPanel:addChild(self.sv)
    6. self.sv:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL) --默认为垂直,只在水平时设置即可
    7. self.sv:setBounceEnabled(true) --默认为false,设置后item总高没超过sv的高度时可滚动
    8. self.sv:setScrollBarEnabled(false) --隐藏滚动条
    9. self.sv:setClippingType(1) --设置裁剪类型避免出现划出显示区域仍然显示的bug
    10. --下面2个API实战用不到这里只做演示
    11. self.sv:setBackGroundColorType(1) --设置背景填充类型(无/纯色背景/渐变背景)
    12. self.sv:setBackGroundColor(cc.c3b(0x90, 0xee, 0x90)) --设置背景颜色

    三.sv的API介绍

    https://docs.cocos2d-x.org/api-ref/cplusplus/v3x/d8/d29/classcocos2d_1_1ui_1_1_scroll_view.html#details

    1. enum {
    2. LAYOUT_CLIPPING_STENCIL,//模板
    3. LAYOUT_CLIPPING_SCISSOR//镂空
    4. }LayoutClippingType;//容器裁切类型

    setClippingType(1)设置裁剪类型,避免出现划出显示区域仍然显示的bug;

    默认为setClippingType(0),setClippingType后的代码执行逻辑可在C++中查看

    四.什么是正确的滚动效果

    4.1 所有item的高度之和 <= sv自身的高度

    滚动超过sv的顶部和底部后放开,sv会回弹到第一个item顶部和sv顶部对齐的位置

    4.2 sv自身的高度 < 所有item的高度之和

    滚动超过sv的底部后放开,sv会回弹到第一个item顶部和sv顶部对齐的位置

    滚动超过sv的顶部后放开,sv会回弹到最下面item底部和sv底部对齐的位置

    五.ScrollView应用举例

    这里介绍一种通过clone创建item的方式,sv通过代码创建了没用cocosstudio中的,示例代码运行的效果如上图所示

    1. if not self.sv then
    2. self.sv = ccui.ScrollView:create()
    3. self.sv:setContentSize(cc.size(670, 595))
    4. self.sv:setPosition(270,27)
    5. self.midPanel:addChild(self.sv)
    6. self.sv:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL) --默认为垂直,只在水平时设置即可
    7. self.sv:setBounceEnabled(true) --默认为false,设置后item总高没超过sv的高度时可滚动
    8. self.sv:setScrollBarEnabled(false) --隐藏滚动条
    9. self.sv:setClippingType(1) --设置裁剪类型避免出现划出显示区域仍然显示的bug
    10. --下面2个API实战用不到这里只做演示
    11. self.sv:setBackGroundColorType(1) --设置背景填充类型(无/纯色背景/渐变背景)
    12. self.sv:setBackGroundColor(cc.c3b(0x90, 0xee, 0x90)) --设置背景颜色
    13. end
    14. local svSize = self.sv:getContentSize()
    15. local itemHeight = 136 --一个item本身的高度+相邻item之间的间距
    16. local totalItemHeight = self.selIndex * itemHeight
    17. local topY = 0
    18. if totalItemHeight < svSize.height then
    19. self.sv:setInnerContainerSize(cc.size(svSize.width, svSize.height))
    20. topY = svSize.height
    21. else
    22. self.sv:setInnerContainerSize(cc.size(svSize.width, totalItemHeight))
    23. topY = totalItemHeight
    24. end
    25. local clonedItem = self.midPanel:getChildByName("cell")
    26. clonedItem:setVisible(false)
    27. self.sv:removeAllChildren()
    28. for i = 1, self.selIndex do
    29. local oneItem = clonedItem:clone()
    30. self.sv:addChild(oneItem)
    31. oneItem:setPosition(cc.p(svSize.width / 2, topY - itemHeight / 2 - itemHeight * (i - 1)))
    32. oneItem:setVisible(true)
    33. --设置item内容
    34. oneItem:getChildByName("label_index"):setString(i)
    35. end

  • 相关阅读:
    MaTiJi - MT3143 - 试管装液
    SpringCloud 之微服务架构编码构建
    借助新电商平台,湖北荷塘三宝直达全国餐桌
    电商类面试问题--01Elasticsearch与Mysql数据同步问题
    【Linux篇】第九篇——Linux下的进程控制
    【网络安全自学宝典】从零开始自学网络安全,按照这个路线就可以了
    用于将内存边界对齐到指定的对齐方式
    1992-2021年省市县经过矫正的夜间灯光数据(GNLD、VIIRS)
    AI数据标注猿知识星球私域社区开始招募啦
    抖音热搜榜上榜操作策略
  • 原文地址:https://blog.csdn.net/ellis1970/article/details/136111094