cocos2dx基础篇(13) 编辑框之二CCEditBox
【3.x】
(1)去掉“CC”
(2)设置虚拟键盘的编辑类型
> EditBoxInputMode 变为强枚举 EditBox::EditBoxInputMode
//
SINGLE_LINE //开启任何文本的输入键盘(不含换行)
ANY //开启任何文本的输入键盘(含换行)
DECIMAL //开启 数字 输入类型键盘(含小数点)
PHONE_NUMBER //开启 电话号码 输入类型键盘
EMAIL_ADDRESS //开启 邮件地址 输入类型键盘
NUMERIC //开启 数字符号 输入类型键盘
URL //开启 URL 输入类型键盘
//
(3)设置输入的文本类型
> EditBoxInputFlag 变为强枚举 EditBox::EditBoxInputFlag
//
PASSWORD //密码形式
SENSITIVE //敏感数据输入
INITIAL_CAPS_WORD //每个单词首字符大写,并有提示
INITIAL_CAPS_SENTENCE //第一句首字符大写,并有提示
INTIAL_CAPS_ALL_CHARACTERS //自动大写
//
(4)设置虚拟键盘中return键显示的字符
> KeyboardReturnType 变为强枚举 EditBox::KeyboardReturnType
//
DEFAULT //默认类型, "←"
DONE //Done字样, "确定"
SEND //Send字样, "发送"
SEARCH //Search字样, "搜索"
GO //Go字样, "链接"
//
CCEditBox的父类为:按钮控件类CCControlButton、输入法代理类CCIMEDelegate。
其中CCControlButton之前是讲过的,它是一个具有许多按钮事件,且使用CCScale9Sprite作为背景图片的按钮类。而CCIMEDelegate这个类主要是为子类提供了虚拟键盘的输入功能。
根据其继承关系,我们大致也可以猜测到CCEditBox是怎么实现的吧?如果说CCTextFieldTTF是一个动态的CCLabelTTF,那么可以将CCEditBox看做是一个动态的CCControlButton,通过不断监听输入的字符,动态设置按钮的标签内容。
其实CCEditBox的用法和CCTectFieldTTF是非常相似的。不过主要的区别在于
使用CCEditBox创建的编辑框,不用额外的代码处理,点击编辑框区域就可以跳出键盘,点击非编辑框区域就可以隐藏键盘。而CCTectFieldTTF却需要手动处理。即父类CCIMEDelegate向子类提供的函数:attachWithIME()、detachWithIME(),对于CCEditBox而言,不需要手动进行处理。
1、引入头文件和命名空间
//
#include "cocos-ext.h"
using namespace cocos2d::extension;
//
2、创建方式
//
//create('编辑框大小', '按钮正常背景', '按钮按下背景', '按钮禁用背景');
static CCEditBox* create(const CCSize& size, CCScale9Sprite* pNormal9SpriteBg,
CCScale9Sprite* pPressed9SpriteBg = NULL, CCScale9Sprite* pDisabled9SpriteBg = NULL);
//举例:
//CCSize editBoxSize = CCSizeMake(300, 60);
//CCEditBox* editBoxName = CCEditBox::create(editBoxSize, CCScale9Sprite::create("green_edit.png"));
//
3、委托代理
//
//设置编辑框的委托代理对象,一般为this
//并且CCLayer必需要继承代理接口类CCEditBoxDelegate。
void setDelegate(CCEditBoxDelegate* pDelegate);
CCEditBoxDelegate* getDelegate();
//举例:
/editBoxName->setDelegate(this);
//
4、常用操作
设置默认内容,输入内容,字体资源名、大小、颜色,最大字符数,编辑框尺寸大小。
//
/**
* setPlaceHolder , setPlaceholderFont ,
* setText , setFont , setMaxLength ,
* setPreferredSize
*/
//设置编辑框的默认内容。即当输入内容为空时,显示的内容。
void setPlaceHolder(const char* pText);
const char* getPlaceHolder(void);
//设置默认内容的字体
// pFontName 字体资源名
// fontSize 字体大小
// color 字体颜色
void setPlaceholderFont(const char* pFontName, int fontSize);
void setPlaceholderFontName(const char* pFontName);
void setPlaceholderFontSize(int fontSize);
void setPlaceholderFontColor(const ccColor3B& color);
//设置编辑框的输入内容setText
void setText(const char* pText);
const char* getText(void);
//设置输入内容的字体
// pFontName 字体资源名
// fontSize 字体大小
// color 字体颜色
void setFont(const char* pFontName, int fontSize);
void setFontName(const char* pFontName);
void setFontSize(int fontSize);
void setFontColor(const ccColor3B& color);
//输入字符控制,允许输入的最大字符长度
void setMaxLength(int maxLength);
int getMaxLength();
//设置编辑框大小
void setPreferredSize(CCSize size);
//
5、设置编辑框的模式类型
虚拟键盘的类型、文本类型、虚拟键盘中return键显示的字符。
//
/**
* setInputMode ,
* setInputFlag ,
* setReturnType
*/
//设置虚拟键盘的编辑类型EditBoxInputMode
// kEditBoxInputModeSingleLine //开启任何文本的输入键盘(不含换行)
// kEditBoxInputModeAny //开启任何文本的输入键盘(含换行)
// kEditBoxInputModeDecimal //开启 数字 输入类型键盘(含小数点)
// kEditBoxInputModePhoneNumber //开启 电话号码 输入类型键盘
// kEditBoxInputModeEmailAddr //开启 邮件地址 输入类型键盘
// kEditBoxInputModeNumeric //开启 数字符号 输入类型键盘
// kEditBoxInputModeUrl //开启 URL 输入类型键盘
void setInputMode(EditBoxInputMode inputMode);
//设置输入的文本类型EditBoxInputFlag
// kEditBoxInputFlagPassword //密码形式
// kEditBoxInputFlagSensitive //敏感数据输入
// kEditBoxInputFlagInitialCapsWord //每个单词首字符大写,并有提示
// kEditBoxInputFlagInitialCapsSentence //第一句首字符大写,并有提示
// kEditBoxInputFlagInitialCapsAllCharacters //自动大写
void setInputFlag(EditBoxInputFlag inputFlag);
//设置虚拟键盘中return键显示的字符
// kKeyboardReturnTypeDefault //默认类型, "←"
// kKeyboardReturnTypeDone //Done字样, "确定"
// kKeyboardReturnTypeSend //Send字样, "发送"
// kKeyboardReturnTypeSearch //Search字样, "搜索"
// kKeyboardReturnTypeGo //Go字样, "链接"
void setReturnType(KeyboardReturnType returnType);
//
6、事件委托代理接口类CCEditBoxDelegate
CCEditBoxDelegate类主要是用来侦听CCEditBox的使用状态,并设置事件的回调响应函数。
使用方法:在创建CCEditBox类的CCLayer类中,让CCLayer继承CCEditBoxDelegate,并重写如下四个事件回调响应函数。
整个编辑框的编辑过程为:开始编辑 => 文字改变 => 结束编辑 => 返回return。
//
//开始编辑时
virtual void editBoxEditingDidBegin(CCEditBox* editBox);
//结束编辑时
virtual void editBoxEditingDidEnd(CCEditBox* editBox);
//编辑框文字改变时
virtual void editBoxTextChanged(CCEditBox* editBox, const std::string& text);
//触发return后
virtual void editBoxReturn(CCEditBox* editBox);
//
7、使用技巧
(1)创建CCEditBox后,设置编辑框的委托代理对象为当前CCLayer层,即setDelegate(this)。只有这样,继承于CCEditBoxDelegate的CCLayer就可以响应编辑框的事件,并执行回调函数。
(2)通过重写CCEditBoxDelegate的四个回调函数,来对编辑框的不同状态事件进行处理。
【代码实战】
代码来源于cocos2dx的官方项目TestCpp中。
1、用到的资源:(在TestCpp项目中可以找到)
2、继承cocos2d::CCEditBoxDelegate,重写事件侦听函数
与CCTextFieldTTF不同的是:使用CCEditBox创建的编辑框,不用额外的代码处理,点击编辑框区域就可以跳出键盘,点击非编辑框区域就可以隐藏键盘。所以不需要添加屏幕的触控事件。
//
class HelloWorld : public cocos2d::CCLayer,CCEditBoxDelegate
{
virtual void editBoxEditingDidBegin(CCEditBox* editBox); //开始编辑
virtual void editBoxEditingDidEnd(CCEditBox* editBox); //结束编辑
virtual void editBoxTextChanged(CCEditBox* editBox, const std::string& text); //编辑框文字改变
virtual void editBoxReturn(CCEditBox* editBox); //触发return后的回调函数
}
//
3、在init()中创建三个编辑框CCEditBox
分别代表:用户名、密码、邮箱。并设置编辑框的相关属性,以及编辑框的模式类型。
//
//编辑框尺寸大小
CCSize editBoxSize = CCSizeMake(mysize.width - 100, 60);
//用户名editBoxName
CCEditBox* editBoxName = CCEditBox::create(editBoxSize, CCScale9Sprite::create("green_edit.png"));
editBoxName->setPosition( ccp(mysize.width/2, mysize.height*3/4) );
this->addChild(editBoxName);
//属性设置
editBoxName->setFontName("fonts/Paint Boy.ttf");
editBoxName->setFontSize(20);
editBoxName->setFontColor(ccRED);
editBoxName->setPlaceHolder("Name:");
editBoxName->setPlaceholderFontColor(ccWHITE);
editBoxName->setMaxLength(8); //限制字符长度
//模式类型设置
editBoxName->setInputMode(kEditBoxInputModeSingleLine);
editBoxName->setInputFlag(kEditBoxInputFlagInitialCapsAllCharacters);
editBoxName->setReturnType(kKeyboardReturnTypeDefault);
//委托代理对象this
editBoxName->setDelegate(this);
//密码editBoxPassword
CCEditBox* editBoxPassword = CCEditBox::create(editBoxSize, CCScale9Sprite::create("orange_edit.png"));
editBoxPassword->setPosition( midPos );
this->addChild(editBoxPassword);
//属性设置
editBoxPassword->setFont("fonts/Marker Felt.ttf", 30);
editBoxPassword->setFontColor(ccGREEN);
editBoxPassword->setPlaceHolder("Password:");
editBoxPassword->setMaxLength(6); //限制字符长度
//模式设置
editBoxPassword->setInputFlag(kEditBoxInputFlagPassword);
editBoxPassword->setReturnType(kKeyboardReturnTypeDone);
//委托代理对象this
editBoxPassword->setDelegate(this);
//邮箱editBoxEmail
CCEditBox* editBoxEmail = CCEditBox::create(editBoxSize, CCScale9Sprite::create("yellow_edit.png"));
editBoxEmail->setPosition( ccp(mysize.width/2, mysize.height/4) );
this->addChild(editBoxEmail);
//属性设置
editBoxEmail->setFont("fonts/Marker Felt.ttf", 30);
editBoxEmail->setPlaceHolder("Email:");
//模式类型设置
editBoxEmail->setInputMode(kEditBoxInputModeEmailAddr);
editBoxEmail->setReturnType(kKeyboardReturnTypeSend);
//委托代理对象this
editBoxEmail->setDelegate(this);
//
4、编写编辑框事件的回调函数
在控制台输出LOG日志。
//
//开始编辑
void HelloWorld::editBoxEditingDidBegin(CCEditBox* editBox)
{
CCLog("editBox %p DidBegin !", editBox);
}
//结束编辑
void HelloWorld::editBoxEditingDidEnd(CCEditBox* editBox)
{
CCLog("editBox %p DidEnd !", editBox);
}
//编辑框内容改变
void HelloWorld::editBoxTextChanged(CCEditBox* editBox, const std::string& text)
{
CCLog("editBox %p TextChanged, text: %s ", editBox, text.c_str());
}
//触发return返回
void HelloWorld::editBoxReturn(CCEditBox* editBox)
{
CCLog("editBox %p was returned !",editBox);
}
//
5、运行结果
因为在win32下,无法开启虚拟键盘。所以我将其移植到android上进行测试。

6、分析与总结
(1)用户名我输入的是“dh”,按return键后,自动变成了大写“DH”。
(2)在输入密码时,显示的是“●”。并且长度限制为6位字符,超过六位后,就拒绝输入了。
(3)不知道大家有没有注意虚拟键盘的右下角的return键有什么变化。是不是每次的打开的虚拟键盘上的return键都不一样呢?“←”,“Done”,“Send”。
cocos2dx基础篇(13) 编辑框之二CCEditBox的更多相关文章
- cocos2dx基础篇(12) 编辑框之一CCTextFieldTTF
前面我们讲了精灵贴图.标签.菜单.按钮.感觉似乎少了点什么?UI控件里是不是应该还有一个很重要的控件--编辑框.在手机网游中,启动游戏,过了开场动画后,基本上显示的第一个界面应该就是游戏的登录界面了吧 ...
- cocos2dx基础篇(3) 常用重要类
---------------------------------------- 入口类main.cpp 主要控制类AppDelegate.cpp -------------------------- ...
- 自动化测试基础篇--Selenium单选框(Radio)复选框(CheckBox)
摘自:https://www.cnblogs.com/sanzangTst/p/7686602.html 一.什么是单选框.复选框? 二.单选框:radio 三.复选框:checkbox 四.判断是否 ...
- 【Cocos2d入门教程二】Cocos2d-x基础篇
上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...
- cocos2dx基础篇(23) 粒子系统CCParticleSystem
[3.x] (1)去掉"CC" (2)粒子位置模式 tPositionType 改为强枚举类型 ParticleSystem::PositionType:: // ...
- cocos2dx基础篇(22) 基本动画CCAnimation/CCAnimate
[小知识] CCSpriteFrame :精灵帧. 它是相对动画而产生的,其实就是一张纹理图片. CCAnimationFrame :动画帧. 由精灵帧与间隔帧数组成,是动画CC ...
- cocos2dx基础篇(7) 触碰事件
cocos2dx游戏引擎的重点是在于移动设备的跨平台开发,而移动设备上的游戏大部分都是通过屏幕触碰来进行的.比如主菜单的按钮触碰,打飞机中飞机的触碰移动,都需要用到触碰操作.想一想之前讲的菜单按钮CC ...
- cocos2dx基础篇(4) 标签CCLabel
[本节内容] cocos2dx三种文字字体的显示:CCLabelTTF(一般字体).CCLabelAtlas(自定义字体).CCLabelBMFont(自定义字体) CCLabelTTF CCLabe ...
- cocos2dx基础篇(2) 第一个程序
[本节内容] 1.程序的基本组成:CCSprite(精灵).CCLayer(层).CCScene(场景).CCDirector(导演) 2.分析HelloWorld源码. 一.基本组成 cocos2d ...
随机推荐
- PHP对有道翻译API函数
首先需要先到http://fanyi.youdao.com/openapi?path=data-mode申请APIKEY.然后公布代码: <?php header("Content-T ...
- js - 基础 之 预编译总结
js运行步骤 语法解析(检查有无语法错误) 预编译 解释运行(将 js 翻译成计算机识别的语言(0.1组成),翻译一行执行一行) 预编译 [全局]: 创建 GO( Grobal Object ) 对象 ...
- Ubuntu 16.04 orb-slam2配置
说明:Ubuntu 16.04以及必要的基础软件安装完成之后进行: 1.OpenNI2安装(可选) 安装依赖项: sudo apt--dev freeglut3-dev doxygen graphvi ...
- docker python3环境搭建
1.使用镜像为daocloud的python镜像 docker run -it --rm --name my-running-script -v "$PWD":/usr/src/m ...
- Google为远程入侵Titan M芯片提供最高150万美元的赏金
Google最近发布了一项新的公告,旨在提高对发现和报告Android操作系统中的严重漏洞的漏洞赏金的奖励,Google昨天为黑客设定了新的挑战性水平,使他们可以赢得高达150万美元的赏金. 从今天开 ...
- 【Luogu5294】[HNOI2019]序列
题目链接 题意 给定一个序列,要求将它改造成一个非降序列,修改一个数的代价为其改变量的平方. 最小化总代价. 另有\(Q\) 次询问,每次修改一个位置上的数.(询问之间独立,互不影响) Sol 神仙 ...
- jmeter录制对于ip代理会失效
jmeter对于ip代理会失效,ip不能走代理,只有域名可以,因此如果需要用jmeter录制ip代理的请求,需要配置hosts访问,将ip转换成域名 如访问http://127.0.0.1:8080/ ...
- [每日一讲] Python系列:字典
#! /usr/bin/python # coding:utf-8 """ DATA STRUCTURE Container: Mapping (Another cont ...
- CF1260F
题目大意 一棵树,每个节点的权为L[i]~R[i],一棵树的贡献为\(\sum\limits_{h_{i} = h_{j}, 1 \le i < j \le n}{dis(i,j)}\),其中\ ...
- print和赋值
赋值 #可同时(并行)给多个变量赋值 x, y, z = 1, 2, 3 #交换多个变量的值 x, y = y, x 序列解包(或可迭代对象解包):将一个序列(或任何可迭代对象)解包,并将得到的值存储 ...