cocosCreator 之 ScrollView

news2024/9/28 23:39:05

版本: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组件, 事件类型,自定义数据
}

拓展

性能优化相关…

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3、Winform表单控件

在学习了布局控件之后,我们就该学习表单控件了。 程序的本质=输入+处理+输出。在Winform程序角度,这里的输入输出就可以用我们的表单控件来实现。 表单控件大致可分为两类,选项控件和文本控件。 文本控件 文本控件常用的有两种,分别是TextBox和RichTextBox TextBox T…

01 矩阵(力扣)多源广度优先搜索 JAVA

给定一个由 0 和 1 组成的矩阵 mat &#xff0c;请输出一个大小相同的矩阵&#xff0c;其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 输入&#xff1a;mat [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff1a;[[0,0,0],[0,1,0],[0,0,0]] 输入…

修改小说阅读器

感谢这个作者的插件&#xff1a;https://ext.dcloud.net.cn/plugin?id2485 1. 搬入后page TypeError: Cannot read property page of undefined 该问题已经解决&#xff0c;有两种方法。第一种&#xff1a;直接注释掉 &#xff0c;第二种 修改为vue3的方式 // 取消ios左滑返…

数据结构和算法一(空间复杂度、时间复杂度等算法入门)

时间复杂度&#xff1a; 空间复杂度&#xff1a; 时间比空间重要 递归&#xff1a; 递归特征&#xff1a; 递归案例&#xff1a; 汉诺塔问题&#xff1a; def hanoi(n,A,B,C):if n>0:hanoi(n-1,A,C,B)print("moving from %s to %s"%(A,C))hanoi(n-1,B,A,C)hanoi…

java中的动态代理机制

目录 什么是动态代理&#xff1f; 为什么需要代理&#xff1f; 代理长什么样子&#xff1f; 代码样例 什么是动态代理&#xff1f; 动态代理可以无侵入式的给代码增加功能 为什么需要代理&#xff1f; 对象如果嫌弃身上的事情太多&#xff0c;就可以通过代理来转移部分的…

STC12C5A系列单片机内部 EEPROM 的应用

参考范例程序。 eeprom.c #include "eeprom.h"/*---------------------------- Disable ISP/IAP/EEPROM function Make MCU in a safe state ----------------------------*/ void IapIdle() {IAP_CONTR 0; //Close IAP functionIAP_CMD 0; …

vue中Swiper动态渲染swiper-slide后轮播图呆滞划不动的问题

因项目开发中很多都有用到轮播图的地方&#xff0c;然后选择用了swiper&#xff0c;记录一下&#xff0c;之前一直没有发布这个文章&#xff0c;现在官方好像已经优化了这个问题。 下载引入&#xff0c;具体参考官方文档Swiper演示 - Swiper中文网 问题描述&#xff1a;在图片…

HiVT、VectorNet运动预测方法分析

1. VectorNet原理 基于DL的运动预测方法有基于渲染的方法和基于坐标点编码的方法&#xff1a;基于渲染的方法通过将交通要素渲染成一张特征图&#xff0c;再基于CNN等网络对特征进行学习&#xff0c;实现目标对象未来轨迹预测。基于交通要素渲染成特征图方法存在CPU算力需求大…

MySQL语句通过腾讯云数据库智能管家的性能与语法优化

最近公司项目迁移至腾讯云&#xff0c;用的腾讯云MySQL服务器&#xff0c;MySQL负载一直很高&#xff0c;借助云管家优化了一部分SQL语句&#xff0c;提升了部分性能和释放了部分&#xff0c;MySQL内存占用

redis(10):spring+redis+mysql缓存实现

1 新建spring项目 2 修改pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mav…

IOC学习笔记(上篇)

IOC学习笔记&#xff08;上篇&#xff09; 目录 IOC容器的职责Ioc容器的实现传统IoC容器的实现依赖查找VS依赖注入构造器注入VS Setter注入面试题 1. 什么是IOC&#xff1f;2. 依赖查找和依赖注入的区别3. Spring作为IOC容器有什么优势 学习视频地址&#xff1a;https://ti…

10分钟搭建链路追踪平台

随着项目越来越多&#xff0c;相互调用越来越复杂&#xff0c;搭建一个可视化的链路追踪平台显得尤为重要&#xff0c;今天给大家介绍的是zipkin&#xff0c;一个轻量级的零侵入的链路追踪平台&#xff0c;看我怎么10分钟给大家搭建出来。 1&#xff0c;介绍 zipkin官网&…

Spring6——入门

文章目录 入门环境要求构建模块程序开发引入依赖创建java类创建配置文件创建测试类运行测试程序 程序分析启用Log4j2日志框架Log4j2日志概述引入Log4j2依赖加入日志配置文件测试使用日志 入门 环境要求 JDK&#xff1a;Java17&#xff08;Spring6要求JDK最低版本是Java17&…

简述centos7如何安装和配置nginx

Nginx&#xff08;发音为"engine x"&#xff09;是一个开源的高性能的 Web 服务器和反向代理服务器。它具有以下特点&#xff1a; 高性能&#xff1a;Nginx 采用事件驱动的异步架构&#xff0c;能够处理大量并发连接而不会占用过多的系统资源。它能够轻松应对高并发访…

1156. 单字符重复子串的最大长度;1497. 检查数组对是否可以被 k 整除;1510. 石子游戏 IV

1156. 单字符重复子串的最大长度 核心思想&#xff1a;利用滑动窗口text[i:j)&#xff0c;不断滑动&#xff0c;滑动窗口中装的是重复的单字符。枚举好窗口&#xff0c;然后看窗口装的字符等于多少个&#xff0c;如果个数小于总个数&#xff0c;说明我们至少可以使它增加1&…

7.25 作业

1.做一个登录界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->setFixedSize(800,600);this->setWindowOpacity(0.9);this->setWindowTitle("登录");this->setWindowIcon(QIcon("E:\\hqyj\\Qt\\icon_h…

SystemVerilog 第2章:数据类型

在 Verilog中,初学者经常分不清reg和wire两者的区别。应该使用它们中哪一个来驱动端口?连接不同模块时又该如何做? Systemverilog对经典的reg数据类型进行了改进,使得它除了作为一个变量以外,还可以被连续赋值、门单元和模块所驱动。为了与寄存器类型相区别,这种改进的数据类…

Java连锁门诊医院HIS信息管理系统源码

Java连锁门诊医院HIS信息管理系统源码&#xff1a;SaaS运维平台多医院多机构多门诊入驻强大的电子病历完整开发文档 一、系统概述 ❉采用主流成熟技术&#xff0c;软件结构简洁、代码规范易阅读&#xff0c;SaaS应用&#xff0c;全浏览器访问前后端分离&#xff0c;多服务协同…

RocketMQ第一课-快速实战以及集群架构搭建

一、RocketMQ产品特点 1、RocketMQ介绍 ​ RocketMQ是阿里巴巴开源的一个消息中间件&#xff0c;在阿里内部历经了双十一等很多高并发场景的考验&#xff0c;能够处理亿万级别的消息。2016年开源后捐赠给Apache&#xff0c;现在是Apache的一个顶级项目。 ​ 早期阿里使用Act…

【如何训练一个中译英翻译器】LSTM机器翻译模型部署(三)

系列文章 【如何训练一个中译英翻译器】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中译英翻译器】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中译英翻译器】LSTM机器翻译模型部署&#xff08;三&#xff09; 目录 系列…