cocosCreator 之 ScrollView

2023-11-16

版本:3.4.0

参考:ScrollView组件


简介

ScrollView组件作为滚动容器来使用,它的实现通过ScrollBar组件来展示内容的位置和Mask组件显示指定区域,来保证有限的区域内显示更多的内容。

请添加图片描述

它的构成部分:

  • ScrollBar滚动条相关, 编译器默认为垂直滚动条,在列表容器中一般active设为false

  • view表示可见区域,它的节点下有个Mask组件遮罩;在该节点下可以添加一个Widget组件,设置自动resize, 一般上下左右拉伸均为0且锁定

  • content 表示滚动区域,如果为列表,可以增加Layout组件,设置水平,垂直,格子布局等,并将Layout组件的ResizeMode设为CONTAINER模式,允许对容器的大小进行改变

    注意: 不要同时使用LayoutWidget,以免产生不可预料的后果。

它的属性部分:

请添加图片描述

属性 功能说明
Horizontal 布尔值,是否允许横向滚动
HorizontalScrollBar 节点引用,用来创建一个滚动条来显示 content 在水平方向上的位置
Vertical 布尔值,是否允许纵向滚动
VerticalScrollBar 节点引用,用来创建一个滚动条来显示 content 在垂直方向上的位置
Inertia 滚动的时候是否有加速度
Brake 浮点数,范围[0, 1],滚动之后的减速系数。为 1 则立马停止滚动,为 0,则会一直滚动到 content 的边界
Elastic 布尔值,是否回弹
BounceDuration 浮点数,范围[0, 10],回弹所需要的时间
Content 节点引用,所有的子节点放到此处
ScrollEvents 列表类型,默认为空,可用于添加一个Target、Component、handler、 CutomEventData的事件
CancelInnerEvents 默认为 true,表示滚动行为会取消子节点上注册的触摸事件

使用

在脚本中使用,最多的情况是作为列表动态添加item相关。需要注意的是:

  • ScrollView的子节点ScrollBar可设置为取消激活状态,即active = false
  • content节点下添加Layout组件,设置自动布局模式

请添加图片描述

注意设置type, ResizeMode, SpacingY即可。

添加item相关,我们会通过**@Property**来获取ScrollView和对应的Prefab,然后通过instantiate克隆将item节点添加到ScrollView的content节点中。

import { _decorator,Component, instantiate, Prefab, ScrollView} from 'cc';
const { ccclass, executeInEditMode, property } = _decorator;
 
@ccclass('UI_DemoLayer')
@executeInEditMode(true)
export class UI_DemoLayer extends Component {
  // 获取ScrollView组件
  @property(ScrollView)
  scroll: ScrollView = null;
  // 获取预制体item
  @property(Prefab)
  itemPrefab: Prefab = null;

  protected onLoad(): void {
    // 清空content下的子节点
    this.scroll.content.removeAllChildren();
    for (let i = 0; i < 10; ++i) {
      // 克隆并将节点添加到content中
      let item = instantiate(this.itemPrefab);
      item.parent = this.scroll.content;
    }
  }
}

官方提供了一些接口支持视图内容进行滚动:

/*
@func: 视图内容将在指定时间滚动到底部、顶部、左侧、右侧、左上、右上、左下、右下
@param: timeInSecond 滚动时间,以秒为单位。如果超时,则立即跳到指定边界
@param: attenuated 滚动速度是否衰减,默认为true
*/
scrollToBottom(timeInSecond?: number, attenuated?: boolean): void;
scrollToTop(timeInSecond?: number, attenuated?: boolean): void;
scrollToLeft(timeInSecond?: number, attenuated?: boolean): void;
scrollToRight(timeInSecond?: number, attenuated?: boolean): void;
scrollToTopLeft(timeInSecond?: number, attenuated?: boolean): void;
scrollToTopRight(timeInSecond?: number, attenuated?: boolean): void;
scrollToBottomLeft(timeInSecond?: number, attenuated?: boolean): void;
scrollToBottomRight(timeInSecond?: number, attenuated?: boolean): void;

// 视图滚动到指定的偏移位置
scrollToOffset(offset: math.Vec2, timeInSecond?: number, attenuated?: boolean): void;
// 获取当前滚动偏移量
getScrollOffset(): math.Vec2;
// 获取最大可滚动偏移量
getMaxScrollOffset(): math.Vec2;

// 视图是否滚动指定的百分比位置
scrollTo(anchor: math.Vec2, timeInSecond?: number, attenuated?: boolean): void;
scrollToPercentVertical(percent: number, timeInSecond?: number, attenuated?: boolean): void;
scrollToPercentHorizontal(percent: number, timeInSecond: number, attenuated: boolean): void;
// 是否滚动中
isAutoScrolling(): boolean;
// 停止滚动
stopAutoScroll(): void;

视图滚动到底部的实例:

// 设置视图10秒后滚动到底部
this.scroll.scrollToBottom(10, true);
// 检测视图是否滚动中
if (this.scroll.isAutoScrolling()) {
  // 如果视图滚动中,则停止滚动
	this.scroll.stopAutoScroll();
}

视图滚动到指定索引位置的实例:

// item有10个,目标索引从0开始
private scrollToIndex(targetIndex: number) {
  // 可视区域内可显示3个,故此可以return调
  if (targetIndex <= 2) {
    return;
  }

  // 获取content大小
  let transform = this.scroll.content.getComponent(UITransform);
  let contentSize = transform.getBoundingBox().size;
  console.log("contentSize:", contentSize.height);
  // 获取布局垂直间隔
  let layout = this.scroll.content.getComponent(Layout);
  let spaceY = layout.spacingY;
  // 获取item大小
  let itemNode = this.scroll.content.children[0];
  let itemSize = itemNode.getComponent(UITransform).getBoundingBox().size;
  //
  const curOffset = this.scroll.getScrollOffset();
  const offsetY = targetIndex * (itemSize.height + spaceY);
  this.scroll.scrollToOffset(new Vec2(0, offsetY), 0);
}

// 添加滚动事件,可用于检测滚动偏移量
onEnable() {
  this.scroll.node.on(ScrollView.EventType.SCROLLING, this.Scrolling, this);
}

private Scrolling() {
  // 注意:如果滚动区域小于可见区域,所有的都为0
  console.log("当前滚动偏移量:", this.scroll.getScrollOffset());
  console.log("最大可滚动偏移量:", this.scroll.getMaxScrollOffset());
}

事件

滚动视图的事件类型主要放置在ScrollView.EventType中,主要有:

类型名 内容
SCROLL_TO_TOP 滚动视图滚动到顶部边界事件。
SCROLL_TO_BOTTOM 滚动视图滚动到底部边界事件。
SCROLL_TO_LEFT 滚动视图滚动到左边界事件。
SCROLL_TO_RIGHT 滚动视图滚动到右边界事件。
SCROLL_BEGAN 滚动视图滚动开始时发出的事件。
SCROLL_ENDED 滚动视图滚动结束的时候发出的事件。
BOUNCE_TOP 滚动视图滚动到顶部边界并且开始回弹时发出的事件。
BOUNCE_BOTTOM 滚动视图滚动到底部边界并且开始回弹时发出的事件。
BOUNCE_LEFT 滚动视图滚动到左边界并且开始回弹时发出的事件。
BOUNCE_RIGHT 滚动视图滚动到右边界并且开始回弹时发出的事件。
SCROLLING 滚动视图正在滚动时发出的事件。滚动视图正在滚动时发出的事件。
SCROLL_ENG_WITH_THRESHOLD 滚动视图自动滚动快要结束的时候发出的事件。
TOUCH_UP 当用户松手的时候会发出一个事件。

脚本中使用on创建的简单实例:

protected onEnable(): void {
  this.scroll.node.on(ScrollView.EventType.SCROLLING, this.scrolling, this);
}

protected onDisable(): void {
  this.scroll.node.off(ScrollView.EventType.SCROLLING, this.scrolling, this);
}

private scrolling(scrollView: ScrollView) {
  // 此种方式的回调,参数只会有一个为ScrollView组件
}

编译器中使用ScrollEvents设定事件,注意设置一个即可

public ScrollEvent_1(scroll: ScrollView, eventType: any, customData: any) {
	// 返回三个参数,分别对应ScrollView组件, 事件类型,自定义数据
}

拓展

性能优化相关…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cocosCreator 之 ScrollView 的相关文章

  • Cocos2d-android游戏引擎-介绍

    一 游戏引擎概念 什么是游戏引擎 游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件 这些系统为游戏设计者提供各种编写游戏所需的各种工具 xff0c 其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开
  • osg学习(六十四)osg的纹理模式 纹理属性

    在osg中都通过渲染状态集StateSet来管理 纹理模式最终调用glEnable glDisable来实现 纹理属性最终调用glBindTexture glTexImage2D glTexParameter等来实现 1 纹理模式 纹理模式
  • 【Cocos谁学谁会】定制属于自己的脚本模板

    版权申明 本文原创首发于以下网站 您可以自由转载 但必须加入完整的版权声明 博客园 https www cnblogs com MogooStudio csdn博客 https blog csdn net nmjkl001 知乎 https
  • cocos cretor shader effect-the book of shader前言

    前言 说来惭愧 半年前开始接触cocso creator shader的时候 看了官方教程 看了大神写的例子 搞懂了一些语法概念 可是当时看一遍有种似懂非懂的感觉 那种感觉就是听过很多道理 任然过不好一生 在cocos论坛里有大神也分享过自
  • [CocosCreator 踩坑记录] 无法保存场景Failed to update asset db

    问题描述 无法保存场景 并出现以下报错 Failed to update asset db assets scences messages Error EISDIR illegal operation on a directory open
  • CocosCreator3.8研究笔记(一)windows环境安装配置

    一 安装Cocos 编辑器 1 下载Cocos Dashboard安装文件 Cocos 官方网站Cocos Dashboard下载地址 https www cocos com creator download9 下载完成后会得到CocosD
  • CocosCreator中的Prefab文件格式总结

    CocosCreator所有的Prefab都是以下类似的格式 我们学会用文本编辑器查看Prefab文件 可以帮助我们更轻松的查找节点 查看节点和组件信息 批量修改节点和组件信息等等 因为在文本编辑器中的Prefab文件才是原始的 而且Coc
  • Rot.js 随机地牢,迷宫地图生成

    js 插件随机地牢 迷宫地图生成 插件git https github com ondras rot js tree master dist 使用 1 我们的游戏是在网页内进行的 一个基本的 HTML 文件就足够了
  • 【项目实战】C/C++语言带你实现:围棋游戏丨详细逻辑+核心源码

    每天一个编程小项目 提升你的编程能力 游戏介绍 下围棋的程序 实现了界面切换 选择路数 和围棋规则 也实现了点目功能 不过只有当所有死子都被提走才能点目 不然不准确 操作方法 鼠标操作 游戏截图 编译环境 VisualStudio2019
  • CocosCreator ios 使用sdl库找不到arm64指令集

    关于sdl如何打包成ios库 android库的问题 之后会有相关文章介绍 现在先说一下CocosCreator在使用xcode运行过程中 会报的一个错 Undefined symbols for architecture arm64的错误
  • SDL2.0渲染图像

    SDL封装了opengl和directx包含图像显示和音频播放 SDL的API文档 https wiki libsdl org SDL渲染图像的步骤 1 初始化接口 int SDLCALL SDL Init Uint32 flags 2 创
  • apk包加固后重新签名

    使用jarsigner对未签名的加固包进行签名 建议您使用之前对APP签名时使用的keystore对加固包进行签名 jarsigner digestalg SHA1 sigalg MD5withRSA verbose keystore yo
  • cocos creator创建简单的动态网格

    如果初次尝试cocos的动态网格创建 一定会遇到非常多的问题 所以刚开始使用 最好用一个简单的东西来实现 逐步的复杂化 下面代码展示了一个最基础的三角面的创建 代码 private initDyMesh const pos new Floa
  • Cocos2d-android游戏引擎

    什么是游戏引擎 游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件 这些系统为游戏设计者提供各种编写游戏所需的各种工具 其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始 Cocos2d家族 coc
  • cocos2d Sprite混合达到水流动效果

    使用Sprite混合setBlendFunc方式达到流动效果 void MainHomeLayer updateWaterFall float dt static float offset 0 if NULL waterFall water
  • Cocos2d-x 3.17.1 Android Studio环境搭建和创建编译项目和真机调试

    eclipse NDK参考 https www cnblogs com l d d p 6531557 html 最近项目上需要用Cocos2d x在Android智能硬件上进行开发 很早之前搭建过Cocos2d x3 15 1 Eclip
  • cocos creator主程入门教程(九)—— 瓦片地图

    这一篇介绍瓦片地图 在开发模拟经营类游戏 SLG类游戏 RPG游戏 都会使用到瓦片地图 瓦片地图地面是通过一个个地砖拼起来的 又分为45度角和90度角两种 45度角俗称2 5D 每个格子都是菱形 而90度角每个格子都是正方形 瓦片地图一般包
  • 【基于Cocos Creator实现的赛车游戏】9.实现汽车节点的控制逻辑

    转载知识星球 深度连接铁杆粉丝 运营高品质社群 知识变现的工具 项目地址 赛车小游戏 基于Cocos Creator 3 5版本实现 课程的源码 基于Cocos Creator 3 5版本实现 在上一节的课程中 您已经实现了通过触控给刚体施
  • CocosCreator用git版本控制时meta文件的冲突解决方法

    我们在多人进行CocosCreator开发时 需要对CCC的meta文件进行提交 meta文件里有CCC编辑器唯一识别的uuid 这个uuid是CCC编辑器对文件识别的唯一标识 如果我们不提交 会造成各个程序员电脑之间的CCC自动生成的uu
  • CocosCreator列表scrollview滑动速度的修改,鼠标滚动速度修改

    由于cocos creator 在pc端 使用scrollview 鼠标滚动速度太慢 原文地址 CocosCreator列表滑动速度的修改 简书CocosCreator列表滑动速度的修改 简书引擎版本 2 2 2 之后升级的2 4 0直接可

随机推荐

  • win7 系统安装图解教程

    链接 http www 360doc com content 10 0720 11 1495415 40258931 shtml
  • 【经典】SpringBoot thymeleaf模板引擎——WEB开发模板引擎

    模板引擎 可以使业务数据和用户界面分离 通过模板引擎自动生成一个HTML文档 简单的说可以理解为 分离数据和界面 简化网页开发 现在主流的模板引擎有Jsp Velocity Beetl Rocker Freemarker thymeleaf
  • ROS学习笔记16:机器人系统建模与仿真

    一 概述 1 机器人系统仿真 是通过计算机对实体机器人系统进行模拟的技术 在 ROS 中 仿真实现涉及的内容主要有三 对机器人建模 URDF 创建仿真环境 Gazebo 以及感知环境 Rviz 等系统性实现 1 仿真优势 低成本 高效 高安
  • Uncaught SyntaxError: Invalid shorthand property initializer at new Function () a

    data options valueField id textField name method get 将method get 等于改为冒号 或者都是一些其他的原因 比如单引号 忘了写逗号
  • Comate: 百度智能云的代码助手

    Comate是什么 Comate是百度智能云推出的一项革命性代码辅助工具 它基于文心大模型的强大理解和推理能力 旨在提高开发者的研发效率 这个全新的工具可以实现代码的快速补齐 自然语言推荐代码和自动查找代码错误等功能 为程序开发提供了全新的
  • vscode安装

    博客 https zhuanlan zhihu com p 106357123 https code visualstudio com download
  • [创业之路-47] :动态股权机制 -2- 多轮融资股权稀释后,大股东保留控制权的常见套路

    正常来说一个蒸蒸日上的公司或者被看好的公司 都要面临融资的问题 融资之后 股权就会发生比较大的变化 多轮融资之后呢 再次引进新的合伙人呢 那时候的股权肯定低于51 甚至低于34 这时候靠什么掌控公司 1 有限合伙平台模式GP VS LP 同
  • windows安装pm2

    pm2是开源的进程管理器 可用于管理您的nodejs项目等 前段时间看到同事使用到此工具 今日特地学习安装使用 安装流程如下 1 确保你电脑安装了npm 可以通过npm v命令查看 npm v 2 安装pm2 命令 npm install
  • 程序员代码打字练习题库

    创建一个新的txt文件 将本文内容全选 粘贴 保存 然后导入金山打字通 即可练习程序员常用词汇 推荐使用金山打字通 英文文章练习 自定义课程 导入txt文件 保存 接下来你就可以联系打字了 path class classpath publ
  • 绕过protected方法的调用(包级共享)

    A类在a包 package a import b B public class A protected void sys System out println A protected sys方法 public static void mai
  • [Activiti 资料]Activiti 画图工具(activiti-designer,actiBPM,activiti-app)

    1 eclipse eclipse的画流程工具 activiti designer 1 1 直接下载Eclipse 或者下载已经安装了activiti designer的eclipse 既然你下载到了 怎么也礼节性的感谢一下哈 链接 htt
  • ENVI入门系列教程---二、图像分析---13. 遥感动态监测

    every blog every motto God helps those who help themselves https blog csdn net weixin 39190382 type blog 0 前言 遥感变化检测就是从不
  • EasyExcel,让excel导入导出更加简单

    EasyExcel EasyExcel是一个基于Java的简单 省内存的读写Excel的开源项目 在尽可能节约内存的情况下支持读写百M的Excel github地址 https github com alibaba easyexcel JA
  • 数据降维算法

    文章目录 效果一览 文章概述 部分源码 参考资料 效果一览 文章概述 数据降维算法 Matlab 基于局部费歇尔判别 LFDA 的分类数据降维可视化 部分源码
  • OpenCV Android以及扩展模块opencv_contrib的编译

    OpenCV和OpenCV contrib模块4 5 x版本的编译 环境准备 Ubuntu 16 04 1 环境变量 export ANDROID HOME work android sdk export ANDROID NDK HOME
  • 【allegro 17.4软件操作保姆级教程一】软件操作环境设置

    个人主页 highman110 作者简介 一名硬件工程师 持续学习 不断记录 保持思考 输出干货内容 目录 1操作环境准备 1 1单位设置 1 2画布面积设置 1 3软件显示设置 1 4布局显示设置 1 5格点设置 1 6大十字光标设置 1
  • 什么场景应该用 MongoDB ?

    月初在云栖社区上发起了一个 MongoDB 使用场景及运维管理问题交流探讨 的技术话题 有近5000人关注了该话题讨论 这里就 MongoDB 的使用场景做个简单的总结 谈谈什么场景该用 MongoDB 很多人比较关心 MongoDB 的适
  • 华为OD机试(JAVA)真题 2023(汽水瓶\随机数\进制转换)

    系列文章目录 文章目录 系列文章目录 前言 一 1 汽水瓶 二 明明的随机数 前言 一 1 汽水瓶 某商店规定 三个空汽水瓶可以换一瓶汽水 允许向老板借空汽水瓶 但是必须要归还 小张手上有n个空汽水瓶 她想知道自己最多可以喝到多少瓶汽水 数
  • 运维岗位面试被问到的问题

    一 tcp ip 三次握手具体过程 二 静态路由动态路由里面有哪些协议 三 ip地址分类 四 iptabled 五 linu系统和windows系统的区别 六 linux软连接与硬链接的区别 七 Linux命令 八 如何将一个用户添加到某一
  • cocosCreator 之 ScrollView

    版本 3 4 0 参考 ScrollView组件 简介 ScrollView组件作为滚动容器来使用 它的实现通过ScrollBar组件来展示内容的位置和Mask组件显示指定区域 来保证有限的区域内显示更多的内容 它的构成部分 ScrollB