【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的更多相关文章

  1. cocos2dx基础篇(12) 编辑框之一CCTextFieldTTF

    前面我们讲了精灵贴图.标签.菜单.按钮.感觉似乎少了点什么?UI控件里是不是应该还有一个很重要的控件--编辑框.在手机网游中,启动游戏,过了开场动画后,基本上显示的第一个界面应该就是游戏的登录界面了吧 ...

  2. cocos2dx基础篇(3) 常用重要类

    ---------------------------------------- 入口类main.cpp 主要控制类AppDelegate.cpp -------------------------- ...

  3. 自动化测试基础篇--Selenium单选框(Radio)复选框(CheckBox)

    摘自:https://www.cnblogs.com/sanzangTst/p/7686602.html 一.什么是单选框.复选框? 二.单选框:radio 三.复选框:checkbox 四.判断是否 ...

  4. 【Cocos2d入门教程二】Cocos2d-x基础篇

    上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...

  5. cocos2dx基础篇(23) 粒子系统CCParticleSystem

    [3.x]     (1)去掉"CC"     (2)粒子位置模式 tPositionType 改为强枚举类型 ParticleSystem::PositionType:: // ...

  6. cocos2dx基础篇(22) 基本动画CCAnimation/CCAnimate

    [小知识] CCSpriteFrame     :精灵帧.    它是相对动画而产生的,其实就是一张纹理图片. CCAnimationFrame  :动画帧.    由精灵帧与间隔帧数组成,是动画CC ...

  7. cocos2dx基础篇(7) 触碰事件

    cocos2dx游戏引擎的重点是在于移动设备的跨平台开发,而移动设备上的游戏大部分都是通过屏幕触碰来进行的.比如主菜单的按钮触碰,打飞机中飞机的触碰移动,都需要用到触碰操作.想一想之前讲的菜单按钮CC ...

  8. cocos2dx基础篇(4) 标签CCLabel

    [本节内容] cocos2dx三种文字字体的显示:CCLabelTTF(一般字体).CCLabelAtlas(自定义字体).CCLabelBMFont(自定义字体) CCLabelTTF CCLabe ...

  9. cocos2dx基础篇(2) 第一个程序

    [本节内容] 1.程序的基本组成:CCSprite(精灵).CCLayer(层).CCScene(场景).CCDirector(导演) 2.分析HelloWorld源码. 一.基本组成 cocos2d ...

随机推荐

  1. Codeforces Round #575 (Div. 3) D1+D2. RGB Substring (easy version) D2. RGB Substring (hard version) (思维,枚举,前缀和)

    D1. RGB Substring (easy version) time limit per test2 seconds memory limit per test256 megabytes inp ...

  2. HMM 传统后向算法

    HMM 传统后向算法,已实现,仅供参考. package jxutcm.edu.cn.hmm.model; import jxutcm.edu.cn.hmm.bean.HMMHelper; impor ...

  3. js时间转时间戳

    转换成时间戳 new Date('2018-10-11 14:28:47'.replace(/-/g, '/')).getTime() //1539239327000

  4. NodeJs 提供了 exports 和 require 两个对象

    Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象. 创建 ...

  5. Python 元组Ⅱ

    删除元组 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例: 以上实例元组被删除后,输出变量会有异常信息,输出如下所示: 元组运算符 与字符串一样,元组之间可以使用 + ...

  6. linux-dns-11

    1网卡设置配置文件里面DNS服务器地址设置,2.系统默认DNS服务器地址设置.3,hosts文件指定 生效顺序是: 1 hosts文件 ---- 2 网卡配置文件DNS服务地址 ---3 /etc/r ...

  7. ubuntu 7z解压

    安装方法:     sudo apt-get install p7zip 解压文件:     7z x manager.7z -r -o /home/xx 解释如下: x 代表解压缩文件,并且是按原始 ...

  8. CTSC&APIO 2017游记

    Day 0 早上4点多起床赶飞机,起床的时候发现闹钟调成下午4点的了...(虽然说早就已经被父母的洗漱声音吵醒了) 飞机上碎觉.到了北京发现比福州还热...而且北京今天意外地好天气,没有传言中的&qu ...

  9. 用flask进行web开发

    经理管理一个餐厅,推出每天都有特色菜的营销模式.他想根据一周中的每一天有一种特色菜. 客人想知道当天的特色菜是什么.另外再添加一个介绍页面.bios路径下,显示餐厅主人,厨师,服务生的简介. pyth ...

  10. [IOI2008/BZOJ1791 岛屿](处理基环树的小技巧&基于bfs树形DP)

    IOI2008/BZOJ1791 岛屿 题目大意是在一个基环树森林里求每一棵基环树的直径①的和. 其实就是树的直径的基环树升级版.我们先把环找出来,然后从环上的每一个节点x出发,并且不经过环上其他节点 ...