Cocos Creator3.8 项目实战(六)Combobox控件的实现和使用

news2024/11/20 14:34:32

在cocoscreator 中,没有Combobox控件,无奈之下只能自己动手写一个。


⚠️ 文末附 ComboBox.ts 、ComboBoxItem.ts 完整源码, 可直接拿去使用。


实现原理:

1、Combobox 背景图background 是一个sprite 控件,上面放了一个label 控件,用于显示选择后的文本。

2、点击 background 背景图显示 下拉列表dropDown,同时变更右边的小三角方向,向下。

3、下拉列表dropDown采用scrollow实现,点击列表项后,隐藏 dropDown ,更新 label 控件显示文本,变更右边的小三角方向,向左。


实现效果

在这里插入图片描述


下面详细介绍使用方法:

step 1 ,在creator层级管理器中,新建 combobox 节点,并做如下配置:

在这里插入图片描述


combobox: 是一个空node 节点,作为根节点

background:背景图,是一个sprite 控件,响应点击事件

Label:combobox 选择后的文本显示

Triangle_button_flg:小三角

dropDown: scrollow 控件

content 添加 vLayout 垂直方向布局


在这里插入图片描述


step 2 ,独立新建一个 预制体文件 comboboxitem. prefab ,并在层级管理器中做以下布局配置:

Bg: 背景用于响应事件

label :显示文本项

在这里插入图片描述


在这里插入图片描述


step 3 ,在层级管理器中选择 combobox 节点, 在属性检查器中,将ComboBox.ts 脚本挂载到combobox 节点下。

并配置对应的属性,如下图:

在这里插入图片描述


step 4 ,在层级管理器中选择 comboboxitem 节点, 在属性检查器中,将ComboBoxItem.ts 脚本挂载到comboboxitem 节点下。

并配置对应的属性,如下图:

在这里插入图片描述


step 5、 ComboBox.ts 完整源码

import { _decorator, Component, Node,Label,instantiate, UITransform,Tween, Prefab, Sprite } from 'cc';
const { ccclass, property } = _decorator;
import {ComboBoxItem} from "./ComboBoxItem"


@ccclass('ComboBox')
export class ComboBox extends Component {
   
    @property(Sprite)
    background:Sprite;
    
    /**
     * 下拉按钮右边的小三角形
     */
    @property(Node)
    triangle:Node;

    /**
     * 下拉按钮上显示的文本
     */
    @property(Label)
    comboLabel:Label;

    
    /**
     * 下拉框
     */
    @property(Node)
    dropDown:Node;

    
    /**
     * 垂直布局
     */
    @property(Node)
    vLayoutNode:Node;

   /**
     *  滚动视图内容
     */
   @property(Node)
   contentNode:Node;


   /**
     *  下拉框选项
     */
   @property(Prefab)
   itemPrefab:Prefab;

   /**
     *  是否下拉状态
     */

    isDropDown:boolean = false;


   /**
     *  
        下拉框选项内容
     */

    itemArray:Array<string>=[];

    onLoad() {

        this.init();
    }


    setData(itemArray:Array<string>){
        this.itemArray.splice(0,this.itemArray.length);
        this.itemArray =itemArray;
        this.resetView();
    }


    initData()
    {
       //  let itemArray = ['Cocos Creator', 'Cocos-2dx', 'Cocos2d-js', 'Cocos2d-Lua', 'Cocos Creator 3D', 'Cocos Service', 'Cocos社区'];
       //  this.setData(itemArray);
    }

    
    resetView()
    {
        let totalHeight = 0;
        for (let i=0; i<this.itemArray.length; i++) {

            let item = instantiate(this.itemPrefab);

            let comboBoxItem:ComboBoxItem = item.getComponent(ComboBoxItem).init(this);
            comboBoxItem.content.string = this.itemArray[i];

            this.vLayoutNode.addChild(item);
            totalHeight += item.getComponent(UITransform).height;
        }

        // 设置content高度
        if (totalHeight > this.contentNode.getComponent(UITransform).height){
            this.contentNode.getComponent(UITransform).height = totalHeight;
        }

    }


    // 子项点击后改变下拉按钮上的文本
    // 更新选择后小三角和下拉框显示
    updateComboboxLabel(selText:string) {
       
        this.comboLabel.string = selText;
        this.isDropDown = false;
        this.dropDown.active = this.isDropDown;
        this.rotateTriangle();
    }


    //获取当前选择的文本
    getComboboxLabel():string {
       return this.comboLabel.string;
    }


    init() {

        this.isDropDown = false;
        this.dropDown.active = false;

        this.background.node.on(Node.EventType.TOUCH_START, this.onClicked, this);
    }

    onClicked(event:Event) {
        this.isDropDown = true;
        this.dropDown.active = this.isDropDown;
        this.rotateTriangle();
    }


    //旋转小三角
    rotateTriangle () {
        // step1: 创建一个针对目标的Tween对象
        // 旋转小三角形(正值为逆时针,负值为顺时针)
        let tw = new Tween(this.triangle);
        if (!this.isDropDown) {

            // step2: 添加执行过程
            tw.to(0.5, {angle:-90});
        }
        else {
            // step2: 添加执行过程
            tw.to(0.5, {angle:0});
        }
         // step3: 开始执行tween对象
         tw.start();
    }


    start() {

        this.initData()
    }

    update(deltaTime: number) {
        
    }
}

step 6、 ComboBoxItem.ts 完整源码

import { _decorator, Component, Node,Label } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('ComboBoxItem')
export class ComboBoxItem extends Component {
   
    @property(Node)
    bg:Node;

    @property(Label)
    content:Label;
    
    comboBox:any;
    start() {

    }

    update(deltaTime: number) {
        
    }

    init(comboBox:any):ComboBoxItem{

        this.comboBox = comboBox;
        this.bg.on(Node.EventType.TOUCH_START, this.onClicked, this);
        return this;
    }


    onClicked(event:Event) {

        this.comboBox.updateComboboxLabel(this.content.string);
    }

}

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

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

相关文章

Python基本功

任何工作&#xff0c;没别的&#xff0c;就是苦练基本功&#xff0c;在篮球场上&#xff0c;我常用非常简单的基本功就可以克敌制胜&#xff0c;工作中也是如此 字符串 1&#xff1a;字符串拼接 a"人民" b123 print("我是"a""str(b))2&#x…

c语言 任意进制数的转换

/* 函数trans将无符号整数n翻译成d&#xff08;2<&#xff1d;d<&#xff1d;16&#xff09;进制表示的字符串s */ #define M sizeof(unsigned int)*8 int trans(unsigned n, int d, char s[]) {static char digits[] "0123456789ABCDEF"; /* 十六进制数字的字…

数据中台实战(06)-数据模型无法复用,归根结底还是设计问题

指标比喻成一棵树的果实&#xff0c;模型就是这棵大树的躯干&#xff0c;想果实好&#xff0c;须让树干粗壮。 1 痛点 分析师一般结合业务做数分&#xff08;需用大量数据&#xff09;&#xff0c;通过报表服务于业务部门运营。但数据中台构建前&#xff0c;分析师经常发现自…

SNP Glue:SAP数据导入到其他系统的多种方式

SAP是一款功能强大的企业资源计划&#xff08;ERP&#xff09;软件&#xff0c;许多企业依赖SAP来管理和处理其核心业务数据。然而&#xff0c;有时候企业需要将SAP中的数据导入到其他系统中&#xff0c;以实现更广泛的数据共享和集成&#xff0c;便于企业实现数据智能。本文将…

IDEA添加Vue文件模板

代码模板&#xff1a; <!-- *${COMPONENT_NAME} *author niemengshi *date ${DATE} ${TIME} --> <template> #[[$END$]]# </template> <script> export default { name: "${COMPONENT_NAME}", props: { }, components: {}, mounted: {}, d…

战火使命ssr排名,战火使命角色强度排行

在战火使命中&#xff0c;很多玩家都在关注SSR角色的强度排行&#xff0c;那么&#xff0c;下面就为大家分享一下小编整理的最新战火使命ssr排名&#xff0c;一起来看看吧。 关注【娱乐天梯】&#xff0c;获取内部福利号 一、SSR角色排名榜&#xff1a; 1. 克拉拉、艾蕾娜、杰西…

C++深入学习part_1

Linux下编译C程序 安装g命令&#xff1a;sudo apt install g 编译命令&#xff1a;$ g *.cc 或者 *.cpp -o fileName; hellworld 编译程序可以看到&#xff1a; namespace命名空间 首先&#xff0c;命名空间的提出是为了防止变量重名冲突而设置的。 浅浅试一下&#xff1…

2023年【高处安装、维护、拆除】考试题及高处安装、维护、拆除最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高处安装、维护、拆除考试题考前必练&#xff01;安全生产模拟考试一点通每个月更新高处安装、维护、拆除最新解析题目及答案&#xff01;多做几遍&#xff0c;其实通过高处安装、维护、拆除考试资料很简单。 1、【单…

OpenCV C++ Look Up Table(查找表)

OpenCV C Look Up Table&#xff08;查找表&#xff09; 引言 在图像处理和计算机视觉中&#xff0c;查找表&#xff08;Look Up Table, LUT&#xff09;是一种非常高效和实用的方法&#xff0c;用于快速地映射或更改图像的颜色和像素值。LUT 能够极大地提高图像处理算法的执…

XSS CSRF

XSS & CSRF xss&#xff1a;跨站脚本攻击&#xff1a;注入一些非法的脚本 csrf&#xff1a;冒充身份 XSS 反射型 /welcome&#xff1a;res.send(req.query.type) 输入什么就输出什么&#xff08;httpOnly:false&#xff0c;但不是解决方案&#xff09; 比如&#xff1a;?&…

【C语言|关键字】C语言32个关键字详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

不断优化的素数算法

前言&#xff1a;素数判断是算法中重要的一环&#xff0c;掌握优秀的素数判断方法是算法player的必修课。本文介绍的是由简到繁的素数算法&#xff0c;便于初学者从入门到精通。 素数&#xff08;质数&#xff09;&#xff1a;只能被 1 和它本身整除的数称作素数&#xff0c;如…

【Linux学习】05-2Linux上部署项目

Linux&#xff08;B站黑马&#xff09;学习笔记 01Linux初识与安装 02Linux基础命令 03Linux用户和权限 04Linux实用操作 05-1Linux上安装部署各类软件 05-2Linux上部署项目 文章目录 Linux&#xff08;B站黑马&#xff09;学习笔记前言05-2Linux上部署项目部署Springboot项目…

【AI视野·今日Sound 声学论文速览 第二十期】Fri, 6 Oct 2023

AI视野今日CS.Sound 声学论文速览 Fri, 6 Oct 2023 Totally 6 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Deep Generative Models of Music Expectation Authors Ninon Liz Masclef, T. Anderson Keller对音乐的情感反应的一个重要理论围绕着惊喜…

时间序列常用数据处理

1.组合技巧Compose 1.2 实例应用及其解释 # 用于组合多个数据处理方法 class Compose(object):def __init__(self, transforms):self.transforms transformsdef __call__(self, seq):for t in self.transforms:seq t(seq)return seq 这段Python代码定义了一个名为Compose的…

星火大模型AI接口Spring中项目中使用【星火、AIGC】

星火大模型AI接口使用 讯飞的星火大模型是有免费版本赠送200万个Token&#xff0c;就个人学习来说完全够用了。 免费申请过后&#xff0c;到控制台&#xff0c;两个红色方框是最要紧的。 星火认知大模型Web文档 | 讯飞开放平台文档中心 (xfyun.cn)这是官方文档对于接口的详细使…

【AI视野·今日NLP 自然语言处理论文速览 四十九期】Fri, 6 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 6 Oct 2023 Totally 44 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MathCoder: Seamless Code Integration in LLMs for Enhanced Mathematical Reasoning Authors Ke Wang, Houxi…

如何一键转发朋友圈,快速跟圈?

你是否曾为在微信上快速转发别人的朋友圈而烦恼&#xff1f;每天都要花费大量时间下载商品图片和复制粘贴商家的文案&#xff0c;让人疲惫不堪。我觉得这样太繁琐太麻烦了&#xff0c;每天都会上新货&#xff0c;上传朋友圈都要花将近一个小时的时间&#xff0c;花了大量时间在…

【C++设计模式之状态模式:行为型】分析及示例

简介 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为&#xff0c;看起来就像是改变了其类。状态模式将对象的状态封装成不同的类&#xff0c;并使得对象在不同状态下有不同的行为。 描述 状态模式通过…

C++ 类和对象篇(五) 析构函数

目录 一、概念 1. 析构函数是什么&#xff1f; 2. 为什么要有析构函数&#xff1f; 3. 怎么用析构函数&#xff1f; 3.1 创建析构函数 3.2 调用析构函数 二、特性 三、由编译器生成的默认析构函数 四、对象的析构顺序 1. 局部对象 2. new出来的堆对象 3. 全局对象 一、概念 1…