cocos2dx Tab选项卡控件的实现
选项卡控件在游戏和应用中很是常见,但是cocostudio里并没有实现好的选项卡控件,于是自己封装了 一个,效果如下:
代码:
TabUiControl.h
#pragma once //std
#include <string> //cocos
#include "cocos2d.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h" using namespace std; USING_NS_CC;
using namespace cocos2d::ui;
using namespace cocostudio;
using namespace cocostudio::timeline; typedef std::function<void(int)> OnTabActioveCallback; //tab控件数据
struct STabBtnData
{
STabBtnData()
{
_pTabBtn = nullptr;
_pBtnTxt = nullptr;
_pContentNode = nullptr;
}
ui::Button *_pTabBtn; //按钮
Text * _pBtnTxt; //按钮文字
Node *_pContentNode; //对应的内容node指针
}; //选项卡控件
class TabUiControl
{
public:
TabUiControl();
virtual ~TabUiControl();
//初始化tab
bool InitTab(Node *pRootNode, int tabCount, bool bHaveContenNode = true,const char *pTabBtnName = "tabBtn", const char *pTabTxtName = "btnTxt", const char *pContentName = "tabContent");
//tab单击事件
void OnTabClick(Ref *pSender);
//激活tab
void ActiveTab(int index);
//设置激活颜色
void SetActiveTxtColor(const Color4B &color){ _activeTxtColor = color; }
//设置未激活颜色
void SetUnActiveTxtColor(const Color4B &color){ _unActiveTxtColor = color; }
//设置选中回调
void SetActiveCallback(OnTabActioveCallback call){ _onActiveCallback = call; }
private:
//初始化静态数据
static void InitDefData();
protected:
static const int MaxTabCount=; //最大tab数量
static int TabValue[MaxTabCount]; //tab 值
int _tabCount; //tab数量
int _tabMaxZorder; //tabMaxZorder
STabBtnData *_pTabBtnData; //tab 数据
Color4B _activeTxtColor; //激活tabBtn文字颜色
Color4B _unActiveTxtColor; //未激活tabBtn文字颜色
OnTabActioveCallback _onActiveCallback; //tab被激活回调
bool _bHaveContenNode; //tab是否有对应的内容节点
private:
};
TabUiControl.cpp
#include "TabUiControl.h" int TabUiControl::TabValue[MaxTabCount]; TabUiControl::TabUiControl()
:_activeTxtColor(, , , ), _unActiveTxtColor(, , , )
{
InitDefData(); _tabMaxZorder = ;
_tabCount = ;
_pTabBtnData = nullptr;
_onActiveCallback = nullptr;
_bHaveContenNode = false; } TabUiControl::~TabUiControl()
{ CC_SAFE_DELETE_ARRAY(_pTabBtnData);
}
void TabUiControl::InitDefData()
{
static bool BInitOk = false;
if (!BInitOk)
{
for (int i = ; i < MaxTabCount; i++)
{
TabValue[i] = i;
} BInitOk = true;
} } bool TabUiControl::InitTab(Node *pRootNode, int tabCount, bool bHaveContenNode, const char *pTabBtnName, const char *pTabTxtName, const char *pContentName)
{
bool ret = false;
do
{
CC_BREAK_IF(!pTabBtnName || !pTabTxtName || !pRootNode || !pContentName);
CC_BREAK_IF(tabCount > MaxTabCount || tabCount <= ); //分配tab 数据
_pTabBtnData = new STabBtnData[tabCount];
_tabCount = tabCount;
_bHaveContenNode = bHaveContenNode; //临时变量
ui::Button *pTempBtn = nullptr;
Text *pTempTxt = nullptr;
Node *pNode = nullptr;
char tc[] = { };
int i = ;
Widget::ccWidgetClickCallback callback = CC_CALLBACK_1(TabUiControl::OnTabClick, this); for (i = ; i < tabCount; i++)
{
//内容节点指针
if (bHaveContenNode)
{
sprintf(tc, "%s%d", pContentName, i);
pNode = StudioUiBase::FindUiChildNode(pRootNode, tc);
CC_BREAK_IF(!pNode);
_pTabBtnData[i]._pContentNode = pNode;
} //tabBtn
sprintf(tc, "%s%d", pTabBtnName, i);
pNode = StudioUiBase::FindUiChildNode(pRootNode, tc);
pTempBtn = dynamic_cast<ui::Button*>(pNode);
CC_BREAK_IF(!pTempBtn);
//btnTxt
pNode = StudioUiBase::FindUiChildNode(pTempBtn, pTabTxtName);
pTempTxt = dynamic_cast<Text*>(pNode);
CC_BREAK_IF(!pTempTxt);
//tab 值
pTempBtn->setUserData(&(TabValue[i]));
//事件
pTempBtn->addClickEventListener(callback);
//保存
_pTabBtnData[i]._pTabBtn = pTempBtn;
_pTabBtnData[i]._pBtnTxt = pTempTxt; }
CC_BREAK_IF(i != tabCount); //获取最大的zorder-----------
int zoreder = ;
_tabMaxZorder = ;
for (i = ; i < tabCount; i++)
{
zoreder = _pTabBtnData[i]._pTabBtn->getLocalZOrder();
if (zoreder>_tabMaxZorder)
_tabMaxZorder = zoreder;
} ret = true;
} while (); return ret;
} void TabUiControl::ActiveTab(int index)
{
if (index >= && index < _tabCount)
{
int zorder = _tabMaxZorder; //选中设置
_pTabBtnData[index]._pTabBtn->setLocalZOrder(_tabMaxZorder);
_pTabBtnData[index]._pTabBtn->setBright(true);
_pTabBtnData[index]._pBtnTxt->setTextColor(_activeTxtColor); //内容可见性
if (_bHaveContenNode)
_pTabBtnData[index]._pContentNode->setVisible(true); //左边的tab
for (int i = index - ; i >= ; i--)
{
//未选中设置
zorder--;
_pTabBtnData[i]._pTabBtn->setLocalZOrder(zorder);
_pTabBtnData[i]._pTabBtn->setBright(false);
_pTabBtnData[i]._pBtnTxt->setTextColor(_unActiveTxtColor); //内容可见性
if (_bHaveContenNode)
_pTabBtnData[i]._pContentNode->setVisible(false);
} //右边的tab
for (int i = index + ; i < _tabCount; i++)
{
//未选中设置
zorder--;
_pTabBtnData[i]._pTabBtn->setLocalZOrder(zorder);
_pTabBtnData[i]._pTabBtn->setBright(false);
_pTabBtnData[i]._pBtnTxt->setTextColor(_unActiveTxtColor); //内容可见性
if (_bHaveContenNode)
_pTabBtnData[i]._pContentNode->setVisible(false);
} //回调
if (_onActiveCallback)
{
_onActiveCallback(index);
} }
} void TabUiControl::OnTabClick(Ref *pSender)
{
do
{
ui::Button *pBtn = dynamic_cast<ui::Button*>(pSender);
CC_BREAK_IF(!pBtn);
void *pUserData = pBtn->getUserData();
CC_BREAK_IF(!pUserData);
int *pValue = (int*)(pUserData);
//激活tab
ActiveTab(*pValue); } while ();
}
使用代码:
//初始化tab
_tabControl.InitTab(pTabNode, );
//默认显示0
_tabControl.ActiveTab();
InitTab函数简要说明:
//pRootNode:tab 和内容节点的父节点 tabCount:tab总数,bHaveContenNode:tab是否有对应的内容节点,pTabBtnName:tab控件名前缀
//pTabTxtName:tab文本名称,pContentName:内容节点控件名前缀
在InitTab中根据pRootNode节点分别找出所有的tab按钮和对应的内容节点,最大的zorder等数据,在tab按钮响应函数里设置激活时的相关属性
cocos2dx Tab选项卡控件的实现的更多相关文章
- 在VC++中使用Tab Control控件
系统环境:Windows 7软件环境:Visual Studio 2008 SP1本次目的:在模态或非模态对话框中使用Tab Control控件,及引申在单/多文档中使用 查阅MSDN文档,对于创建T ...
- C++ MFC Tab Control控件的详细使用
1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置I ...
- TabControl 选项卡控件
TabControl 控件是由System.Windows.Forms.TabControl类提供的,作用就是讲相关的组件组合到一系列选项卡页面上. MulitiLine 属性用来设置是否显示多行 ...
- KRBTabControl(中文)Windows选项卡控件
本文阐述了如何在C#使自定义Windows选项卡控件. Download demo project - 82.4 KB Download source - 252 KB 介绍 本文讨论如何使用.NET ...
- 通过编写串口助手工具学习MFC过程——(七)添加Tab Control控件
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- MFC编程 | tab control控件的使用
因为课程需要,会用到MFC编程,所以讲一些经验总结下,以便日后使用查询. // tab control控件的使用 // 建立一个Cluster窗口,通过tab可以切换成C-Means和Fuzzy C- ...
- 基于duilib实现的可滑动tab标签控件
最近一直在忙棋牌游戏大厅的开发,使用了duilib界面库,在大厅界面游戏菜单的展现上需要用到滑动的效果,类似悠扬棋牌,jj棋牌的菜单左右(上下)滑动的效果.通过自己的设计思路完善了一个可滑动的tab标 ...
- 在WinForm应用程序中,使用选项卡控件来加载不同的Form界面!
TabPage tp=new TabPage(); your选项卡控件.Controls.Add(tp); From1 frm=new Form1(); frm.TopLevel = false; f ...
- C# 选项卡控件
选项卡控件,它提供一系列操作按钮,单击不同的按钮可以在各个页面之间进行切换. 在Windows Form应用程序中,选项卡控件即“TebPage”控件,它公开“TebPage”属性,表示一个由“Tab ...
随机推荐
- Mac下Sublime Text Vim模式 方向键无法长按
在Mac终端输入(不是sublime text里的console),分别对应ST2.ST3: defaults ApplePressAndHoldEnabled -bool false default ...
- [未完成]关于枚举(Enum)
今天总结一下枚举相关的知识.先附一段关于枚举的代码: package org.talend.core.model.param; import org.talend.core.i18n.Messages ...
- Time complexity analysis of algorithms
时间复杂性的计算一般而言,较小的问题所需要的运行时间通常要比较大的问题所需要的时间少.设一个程序P所占用的时间为T,则 T(P)=编译时间+运行时间. 编译时间与实例特征是无关的,且可假设一个编译过的 ...
- 最大公约数与欧几里得(Euclid)算法
---恢复内容开始--- 记a, b的最大公约数为gcd(a, b).显然, gcd(a,b)=gcd(|a|,|b|). 计算最大公约数的Euclid算法基于下面定理: [GCD递归定理]对于任意非 ...
- Apple Watch: WatchKit 应用程序要点
Apple Watch: WatchKit 应用程序要点 本文译自:Apple Watch: WatchKit App Essentials WatchKit 应用程序架构 上一篇文章简单介绍了 Wa ...
- 通过spring来配置某个命令号和执行方法之间的映射
整理的内容 1.手动获取spring的ApplicationContext和bean对象 写一个工具类实现ApplicationContextAware接口 2.反射的知识整理 3.前后端协议交互的时 ...
- c#中字符串显示上标和下标解决办法
由于工作的需求,需要在word中插入带入带有上标和下标的字符串,比如这样的一个字符串:SO₄²⁻(mg/L).在网上搜了好久,终是摸索出点思路. 解决办法:使用转义字符加Unicode的HexEnti ...
- Asp.net MVC 4 视图相关和其他
@{ Layout = “…”} To define layout page Equivalent to asp.net master-page 要定义相当于ASP.NET母版页的页面布局 @mode ...
- C#学习笔记8:HTML和CSS基础学习笔记
<!-- 1.<P>...</P>段落标签 2.<br/>折行标签. 3.<img src="" height="*px& ...
- AppWidgetProvider生命周期
1.在桌面上添加小部件,让小部件可用会调用:onEnabled 2.作为通知会调用onReceive 3.小部件可用后会调用onUpdate,表明小部件状态由不可用变为可用发生了变化 4.作为通知又会 ...