cocosCreator 之 ScrollView

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

拓展

性能优化相关…

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

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

相关文章

03 shell 编程

变量 语言型 编译型语言 解释型语言 shell脚本语言是解释型语言shell脚本的本质&#xff1a;shell命令的有序集合 shell 编程的基本过程 基本过程分为三步&#xff1a; step1. 建立 shell 文件 包含任意多行操作系统命令或shell命令的文本文件; step2. 赋予shell文件执行…

23 自定义控件

案例&#xff1a;组合Spin Box和Horizontal Slider实现联动 新建Qt设计师界面&#xff1a; 选择Widget&#xff1a; 选择类名&#xff08;生成.h、.cpp、.ui文件&#xff09; 在smallWidget.ui中使用Spin Box和Horizontal Slider控件 可以自定义数字区间&#xff1a; 在主窗口w…

脑电信号处理与特征提取——1. 脑电、诱发电位和事件相关电位(胡理)

目录 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 1.2 经典的ERPs成分及研究 1.2.1 ERPs命名规则及分类 1.2.2 常见的脑电成分 1.2.3 P300及Oddball范式 1.2.4 N400成分 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 EEG(Electroencephalogram)&#x…

MFC第二十天 数值型关联变量 和单选按钮与复选框的开发应用

文章目录 数值型关联变量数值型关联变量的种类介绍 单选按钮与复选框单选按钮的组内选择原理解析单选按钮和复选框以及应用数值型关联变量的开发CMainDlg.cppCInputDlg.hCInputDlg.cpp 附录 数值型关联变量 数值型关联变量的种类介绍 1、 数值型关联变量&#xff1a; a)控件型…

全志F1C200S嵌入式驱动开发(解决spi加载过慢的问题)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 之前的几个章节当中,我们陆续解决了spi-nor驱动的问题、uboot支持spi-nor的问题。按道理来说,下面要做的应该就是用uboot的loady命令把kernel、dtb、rootfs这些文件下载到ddr,然…

执行 yum install gcc 报 【-bash: $‘yum\302\240install\302\240gcc‘: 未找到命令】

执行 yum install gcc 报错 找了一圈&#xff0c;执行&#xff1a;sudo apt-get install yum 执行&#xff1a;wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz 在线下载yum完成 对其进行解压&#xff1a;tar zxvf yum-3.2.28.tar.gz 解压后如下&#xff1a; 执行…

Tiny Player (js) - 轻量好用、免费开源的 web 视频播放开发组件,内置硬解、软解视频功能

一款简单好用的 JS 视频播放器&#xff0c;完美解决我遇到的移动端播放视频的需求&#xff0c;安利给各位。 关于 Tiny Player Tiny Player 是一个极简的视频播放器 JS 库&#xff0c;内置硬解、软解视频功能&#xff0c;支持原生控件样式以及自定义控件样式&#xff0c;小巧…

Android Service启动ANR原理

一、前言 在Service组件StartService()方式启动流程分析文章中&#xff0c;针对Context#startService()启动Service流程分析了源码&#xff0c;其实关于Service启动还有一个比较重要的点是Service启动的ANR&#xff0c;因为因为线上出现了上百例的"executing service &quo…

vue三级路由的写法

{path: "/trafficmanagement",component: Layout,redirect: "/trafficmanagement",alwaysShow: true,meta: {title: "通行模块",icon: "excel",},children: [{path: "carline",name: "carline",alwaysShow: true,…

OpenCV图像处理-视频分割静态背景-MOG/MOG2/GMG

视频分割背景 1.概念介绍2. 函数介绍MOG算法MOG2算法GMG算法 原视频获取链接 1.概念介绍 视频背景扣除原理&#xff1a;视频是一组连续的帧&#xff08;一幅幅图组成&#xff09;&#xff0c;帧与帧之间关系密切(GOP/group of picture)&#xff0c;在GOP中&#xff0c;背景几乎…

LeetCode116. 填充每个节点的下一个右侧节点指针

116. 填充每个节点的下一个右侧节点指针 文章目录 [116. 填充每个节点的下一个右侧节点指针](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/)一、题目二、题解方法一&#xff1a;迭代方法二&#xff1a;递归 一、题目 给定一个 完美二叉树 &…

【nginx】nginx中root与alias的区别:

文章目录 root与alias主要区别在于nginx如何解释location后面的uri&#xff0c;这会使两者分别以不同的方式将请求映射到服务器文件上。 root的处理结果是&#xff1a;root路径&#xff0b;location路径 alias的处理结果是&#xff1a;使用alias路径替换location路径 alias是一…

Qt Core学习日记——第七天QMetaObject(上)

每一个声明Q_OBJECT的类都具有QMetaObject对象 Q_OBJECT宏源代码&#xff1a; #define Q_OBJECT \ public: \ QT_WARNING_PUSH \ Q_OBJECT_NO_OVERRIDE_WARNING \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *metaObject() const; \ vir…

istio安装部署总结

istio安装部署总结 大纲 istio基础概念版本选择安装istio核心主件卸载istiokiali安装 istio基础概念 https://istio.io/latest/zh/docs/ 中文文档 istio是一个服务治理平台&#xff0c;治理服务间的访问&#xff0c;&#xff08;例如流量控制&#xff0c;安全策略&#xf…

【C++链表】

目录 前言一、搭建链表实现的框架二、链表的构造函数三、链表的尾插四、链表的遍历(重点)迭代器的遍历const修饰的迭代器 五、代码实现 前言 最近用C写了一下list的基本功能&#xff0c;感触颇深。本以为会跟之前用C写list一样会很轻松&#xff0c;没想到更难了。要考虑的东西…

代码随想录| 图论04 查并集 ●查并集理论知识 ●1971.寻找图中是否存在路径 ●684.冗余连接 ●685.冗余连接II

#查并集理论知识 并查集用处&#xff1a;解决连通性问题 将两个元素添加到一个集合中。判断两个元素在不在同一个集合 思路&#xff1a;将三个元素A&#xff0c;B&#xff0c;C &#xff08;分别是数字&#xff09;放在同一个集合&#xff0c;其实就是将三个元素连通在一起&a…

k8s常见的资源对象使用

目录 一、kubernetes内置资源对象 1.1、kubernetes内置资源对象介绍 1.2、kubernetes资源对象操作命令 二、job与cronjob计划任务 2.1、job计划任务 2.2、cronjob计划任务 三、RC/RS副本控制器 3.1、RC副本控制器 3.2、RS副本控制器 3.3、RS更新pod 四、Deployment副…

IBM:2023 年数据泄露的平均成本将达到 445 万美元

IBM 发布年度《数据泄露成本报告》&#xff0c;显示 2023 年全球数据泄露平均成本达到 445 万美元&#xff0c;比过去 3 年增加了 15%。创下该报告的历史新高。 报告显示&#xff0c;企业在计划如何应对日益增长的数据泄露频率和成本方面存在分歧。研究发现&#xff0c;虽然 95…

自定义MVC

目录 一.什么是MVC 1.1.三层架构和MVC的区别 二.自定义MVC工作原理图 三.自定义mvc实现 3.1 创建web工程 3.2 中央处理器 3.3 Action接口定义 3.4 实现子控制器 3.5 完善中央控制器 3.5.1 请求分发功能 3.5.2 使用配置文件配置action 3.5.3 请求参数处理 1. 定义接…

QT DAY1

1.思维导体 2.作业 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {qDebug()<<this->size();qDebug()<<this->rect().size();qDebug()<<this->geometry().size();qDebug()<<this->frameGeometry().siz…