cocos2dx基础篇(14)——文本框之一CCTextFieldTTF

【引言】

前面我们讲了精灵贴图、标签、菜单、按钮。感觉似乎少了点什么?UI控件里是不是应该还有一个很重要的控件——文本框。在手机网游中,启动游戏,过了开场动画后,基本上显示的第一个界面应该就是游戏的登录界面了吧。输入用户名、密码什么的,这些都是需要借助文本框来实现输入的。点击文本,弹出虚拟键盘,输入账号密码,点击登录。

cocos2dx引擎为我们提供了两类文本框的控件:

(1)CCTextFieldTTF(基于CCLabelTTF)

(2)CCEditBox(基于CCControlButton)

本节就先讲述一下CCTextFieldTTF吧。

【参考文献】

http://gl.paea.cn/contents/ff7cec4ea13b9be4.html

http://blog.csdn.net/crayondeng/article/details/12175367

【术语解释】

IME:是指Input Method Editors,即输入法编辑器。



【CCTextFieldTTF】

让我们先看一下CCTextFieldTTF的继承关系:

可见,CCTextFieldTTF的父类为:字体标签类CCLabelTTF、输入法代理类CCIMEDelegate。

其中CCLabelTTF之前是讲过的,它是一个用于显示文字的标签类。而CCIMEDelegate这个类主要是为子类提供了虚拟键盘的输入功能。

根据其继承关系,我们大致也可以猜测到CCTextField是怎么实现的吧?这个估计就是一个动态的 CCLabelTTF ,通过不断监听输入的字符,动态设置标签的内容。

接下来就来讲讲它的使用方法吧!

1、创建方式

注意:CCTextFieldTTF的创建不是使用create,而是textFieldWithPlaceHolder

class CC_DLL CCTextFieldTTF : public CCLabelTTF, public CCIMEDelegate

/**
 *		创建CCTextFieldTTF的两种方式
 *		textFieldWithPlaceHolder
 */

//placeholder:默认内容。即输入为空时显示的内容。
//fontName:   字体资源名。
//fontSize:   字体大小。
//文本框的大小为:CCLabelTTF的大小。且在输入的过程中,若内容超过文本框的大小,会自动扩展。
static CCTextFieldTTF* textFieldWithPlaceHolder(const char* placeholder, const char* fontName, float fontSize);

//placeholder:默认内容。即输入为空时显示的内容。
//dimensions: 文本框的尺寸大小。
//alignment:  文本内容的对齐方式。
    //kCCTextAlignmentLeft      左对齐
    //kCCTextAlignmentCenter    居中,默认方式
    //kCCTextAlignmentRight     右对齐
//文本框的大小固定,不可扩展。
static CCTextFieldTTF* textFieldWithPlaceHolder(const char* placeholder, const CCSize& dimensions, CCTextAlignment alignment, const char*fontName, float fontSize);

/**
 *		创建方式举例
 */
CCTextFieldTTF::textFieldWithPlaceHolder("Please Click Me!", "Marker Felt", 24);
CCTextFieldTTF::textFieldWithPlaceHolder("Please Click Me!", CCSizeMake(100,100), CCTextAlignment::kCCTextAlignmentCenter, "Marker Felt", 24);

2、常用操作

委托对象、字符个数、默认内容及字体颜色、输入内容及字体颜色。

/**
 *		属性设置
 *		setDelegate , getCharCount , 
 *		setPlaceHolder , setColorSpaceHolder ,
 *		setString , setColor
 */

//设置虚拟键盘的委托对象,一般为this
//并且CCLayer必需要继承代理接口类CCTextFieldDelegate。
CC_SYNTHESIZE(CCTextFieldDelegate*, m_pDelegate, Delegate);

//获取字符个数,只读get
CC_SYNTHESIZE_READONLY(int, m_nCharCount, CharCount);

//设置文本框默认内容。即输入为空时显示的内容
virtual void setPlaceHolder(const char * text);
virtual const char* getPlaceHolder();

//设置文本框默认内容的字体颜色
virtual void setColorSpaceHolder(const ccColor3B& color);
virtual const ccColor3B& getColorSpaceHolder();

//设置文本框输入内容
virtual void setString(const char *text);
virtual const char* getString();

//设置文本框输入内容的字体颜色
virtual void setColor(const ccColor3B& color);
virtual const ccColor3B& setColor();

3、父类CCIMEDelegate向子类提供的函数

实现虚拟键盘的输入功能。

virtual bool attachWithIME(); //开启虚拟键盘,并允许输入。
virtual bool detachWithIME(); //关闭虚拟键盘,并停止输入。

//textFieldTTF->attachWithIME();

4、事件代理接口类CCTextFieldDelegate

CCTextFieldDelegate类主要是用来侦听CCTextFieldTTF的使用状态,并设置事件的回调响应函数。

使用方法:在创建CCTextFieldTTF类的CCLayer类中,让CCLayer继承CCTextFieldDelegate,并重写如下四个事件回调响应函数。

//当用户启动虚拟键盘时的回调函数
//启用键盘false; 不启用键盘true
virtual bool onTextFieldAttachWithIME(CCTextFieldTTF* sender)

//当用户关闭虚拟键盘时的回调函数
//关闭键盘false; 不关闭键盘true
virtual bool onTextFieldDetachWithIME(CCTextFieldTTF* sender)

//当用户输入时的回调函数
//允许输入字符false; 不允许输入字符true
virtual bool onTextFieldInsertText(CCTextFieldTTF* sender, const char* text, int nLen)

//当用户删除文字时的回调函数
//允许删除字符false; 不允许删除字符true
virtual bool onTextFieldDeleteBackward(CCTextFieldTTF* sender, const char* delText, int nLen)

5、使用技巧

(1)创建CCTextFieldTTF后,设置文本框的委托对象为当前CCLayer层,即setDelegate(this)。只有这样,继承于CCTextFieldDelegate的CCLayer就可以响应文本框的事件,并执行回调函数。

(2)通过通过触碰事件Touch,判断触点是否触碰到文本框内部,来决定是否开启虚拟键盘。触碰到内部,就开启;触碰到外部,就关闭。

(3)通过重写CCTextFieldDelegate的四个回调函数,来对文本框的不同状态事件进行处理。



【代码实战】

    (1)让HelloWorld类继承cocos2d::CCTextFieldDelegate,重写事件侦听函数。并在HelloWorld类中开启触控事件。

        记得在onEnter和onExit中注册和注销触控事件哦!

class HelloWorld : public cocos2d::CCLayer,cocos2d::CCTextFieldDelegate
{
	virtual bool onTextFieldAttachWithIME(CCTextFieldTTF* sender); //当用户启动虚拟键盘的时候的回调函数
	virtual bool onTextFieldDetachWithIME(CCTextFieldTTF* sender); //当用户关闭虚拟键盘的时候的回调函数
	virtual bool onTextFieldInsertText(CCTextFieldTTF* sender, const char* text, int nLen); //当用户输入的时候的回调函数
	virtual bool onTextFieldDeleteBackward(CCTextFieldTTF* sender, const char* delText, int nLen); //当用户删除文字的时候的回调函数

	//开启触控
	virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
	virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
	virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
	virtual void onEnter();
	virtual void onExit();
};

(2)在init()中创建文本框CCTextFieldTTF,并给与Tag标记为tag = 1。

CCTextFieldTTF* textFieldTTF = CCTextFieldTTF::textFieldWithPlaceHolder("please input", "Marker Felt", 24);
//CCTextFieldTTF* textFieldTTF = CCTextFieldTTF::textFieldWithPlaceHolder("please input", CCSize(100,100), CCTextAlignment::kCCTextAlignmentCenter, "Arial", 20);
textFieldTTF->setPosition( midPos );
this->addChild(textFieldTTF, 0, 1); //tag标记1

//设置虚拟键盘委托对象
textFieldTTF->setDelegate(this);

(3)编写触控事件回调函数。根据触点位置,判断开启或关闭虚拟键盘的输入功能。

bool HelloWorld::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
	CCLOG("ccTouchBegan");
	return true;
}

void HelloWorld::ccTouchMoved(CCTouch* touch, CCEvent* event)
{
	CCLOG("ccTouchMoved");
}

void HelloWorld::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
	CCLOG("ccTouchEnded");

//获取触点
	CCPoint pos = touch->getLocation();

//获取textFieldTTF所在的矩形区域rect
	CCTextFieldTTF* textFieldTTF = (CCTextFieldTTF*)this->getChildByTag(1);
	float x = textFieldTTF->getPositionX() - textFieldTTF->getContentSize().width/2;
	float y = textFieldTTF->getPositionY() - textFieldTTF->getContentSize().height/2;
	float width = textFieldTTF->getContentSize().width;
	float height = textFieldTTF->getContentSize().height;
	CCRect rect = CCRectMake(x, y, width, height);

//判断触点是否触摸到文本框内部
	if( rect.containsPoint(pos) ) {
		CCLOG("attachWithIME");
		textFieldTTF->attachWithIME(); //开启虚拟键盘
	}else {
		CCLOG("detachWithIME");
		textFieldTTF->detachWithIME(); //关闭虚拟键盘
	}
}

(4)编写文本框事件的回调函数。

当启用虚拟键盘,开始输入时,放大字体大小,并改变字体颜色。

当关闭虚拟键盘,停止输入时,还原字体大小,并改变字体颜色。

//当用户启动虚拟键盘的时候的回调函数
bool HelloWorld::onTextFieldAttachWithIME(CCTextFieldTTF* sender)
{
	//事件处理
	sender->setFontSize(30); //字体放大为30
	sender->setColor(ccYELLOW); //内容颜色: ***
	sender->setColorSpaceHolder(ccWHITE); //默认内容颜色: 白色

	return false; //启用键盘。若不启用键盘return true;
}

//当用户关闭虚拟键盘的时候的回调函数
bool HelloWorld::onTextFieldDetachWithIME(CCTextFieldTTF* sender)
{
	//事件处理
	sender->setFontSize(24); //字体大小还原为24
	sender->setColor(ccORANGE); //内容颜色: 橘黄
	sender->setColorSpaceHolder(ccGRAY); //默认内容颜色: 灰色

	return false; //关闭键盘。若不关闭键盘return true;
}

//当用户输入的时候的回调函数
bool HelloWorld::onTextFieldInsertText(CCTextFieldTTF* sender, const char* text, int nLen)
{
	//事件处理
	CCLOG("CharCount: %d", sender->getCharCount());

	return false; //输入字符。若不允许输入字符return true;
}

//当用户删除文字的时候的回调函数
bool HelloWorld::onTextFieldDeleteBackward(CCTextFieldTTF* sender, const char* delText, int nLen)
{
	return false; //删除字符。若不允许删除字符return true;
}

运行结果:

分析:

(1)若文本框中未输入任何字符时,文本显示的是默认内容“please input”。而当文本框中有输入内容时,文本显示的是输入内容。

(2)文本框的尺寸大小,会根据输入的内容大小,自动进行扩展。

(3)输入内容后,可以通过回车键(Enter)结束输入。可以通过回退键(BackSpace)删除字符。

(4)最最关键的问题是:说好的虚拟键盘呢?为什么是用电脑键盘输入的。好吧,因为Win32没有虚拟键盘,要是想看虚拟键盘的效果,就需要移植到手机上。

手机上的运行截图如下:

看到虚拟键盘,是不是很激动呀激动呀!



【Demo下载】

http://down.51cto.com/data/1866299

时间: 2024-08-25 06:47:00

cocos2dx基础篇(14)——文本框之一CCTextFieldTTF的相关文章

iOS系列 基础篇 08 文本与键盘

iOS系列 基础篇 08 文本与键盘 目录: 1. 扯扯犊子 2. TextField 3. TextView 4. 键盘的打开和关闭 5. 打开/关闭键盘的通知 6. 键盘的种类 7. 最后再扯两句 1. 扯扯犊子 与Label一样,TextField和TextView也是文本类控件,是可以编辑文本内容的. 在控件内容编辑方面,三者都可以通过代码.双击该控件和属性检查器中的Text属性来实现,但是TextField和TextView比Label多了一个键盘的使用. 另外,TextField和T

Uni-app基础实战富文本框解析 WordPress rest api实例(二)

Uni-app基础实战富文本框解析 WordPress rest api实例 文本是更具上篇文章uni-app上下拉刷新的续文有需要了解上文的请点击下面连接访问 传送门: Uni-app实战上加载新下拉刷新 WordPress rest api实例 那么我们就开始了,主要的要是去介绍了以下一个插件的使用方式.官方的富文本框有markdown和html两种方式,但是样式欠佳! 本文插件传送门:uParse修复版,优化表格,css等,html富文本加载 1.导入组件 官网可以一键导入,直接点击hbu

cocos2dx基础篇(12)——点九图CCScale9Sprite

[引言] 本来是想学学控件类CCControl的另一个子类按钮控件CCControlButton的.但是发现里面有一个参数牵扯到CCScale9Sprite这个类.看到CCScale9Sprite,很容易联想到精灵类CCSprite.两者又有什么区别呢?因此我就去网上收了一些有关CCScale9Sprite的资料来学习. [参考文献] [1] http://blog.csdn.net/nynyvkhhiiii/article/details/12782249 [2] http://www.cnb

cocos2dx基础篇(7)——菜单按钮CCMenu、CCMenuItem

[本节内容] 菜单按钮在游戏中是经常被用到的,比如主菜单界面的菜单选项,暂停游戏时的菜单选项等等.cocos2dx引擎同样为我们提供了CCMenu菜单的功能,并包含了一些简单的菜单项CCMenuItem.且菜单项附带触碰按钮时,自动放大的效果. 温馨提示:本节内容比较多,需要大家慢慢分析,不要急于求成. 本节组织结构如下: 一.介绍CCMenu. 二.介绍CCMenuItem,及其具体的六个子类. 三.代码实战. [一.菜单CCMenu] 菜单CCMenu是专门用来承载菜单按钮的CCLayer图

cocos2dx基础篇(13)——按钮控件CCControlButton

[引言] 按钮类CCControlButton继承于控件类CCControl. 控件类CCControl主要向子类提供了一系列的控件触发事件.当子控件触发相关的事件后,就会执行相关的控件事件回调函数.这与之前讲的CCMenu中的菜单按钮回调是类似的. 控件类CCControl主要有三个子类: (1)开关控件CCControlSwitch (2)滑块控件CCControlSlider (3)按钮控件CCControlButton 本节讲的是其子类其中之一:按钮类CCControlButton. [

cocos2dx基础篇(4)——浅析cocos2dx引擎目录

通过前面几节的学习,相信大家都已经配置好了VS+cocos2dx2.2.3的环境,并且成功运行了官方的案例HelloWorld. 一.窥探文件目录 要想学好cocos2dx,首先就需要对引擎目录下的各个文件有所了解.接下来,就让我们先来分析一下cocos2dx2.2.3引擎的文件目录吧. 从目录中我们主要了解一下一下几个文件: cocos2dx:cocos2d-x引擎的核心部分,存放了引擎的大部分源文件. CocosDenshion:声音模块相关源文件. Debug.win32:在Windows

cocos2dx基础篇(5)——浅析几个常见类

目录 入口类main.cpp 主要控制类AppDelegate.cpp 节点类CCNode 导演类CCDirector 场景类CCScene 层次类CCLayer 精灵类CCSprite 大小类CCSize 坐标CCPoint 矩形类CCRect 数组类CCArray 入口类main.cpp 这是应用程序的入口类,用于创建cocos2dx的AppDelegate实例.窗口大小.以及运行程序. 主要代码如下:     // create the application instance     A

cocos2dx基础篇(10)——开关按钮CCControlSwitch

[本节内容] 开关类CCControlSwitch继承于控件类CCControl. 控件类CCControl主要向子类提供了一系列的控件触发事件.当子控件触发相关的事件后,就会执行相关的控件事件回调函数.这与之前讲的CCMenu中的菜单按钮回调是类似的. 控件类CCControl主要有三个子类: (1)开关控件CCControlSwitch (2)滑块控件CCControlSlider (3)按钮控件CCControlButton 本节讲的是其子类其中之一:开关类CCControlSwitch.

cocos2dx基础篇(8)——定时器更新schedule、update

[本节内容] 定时器在大部分游戏中是不可或缺的,即每隔一段时间,就要执行相应的刷新体函数,以更新游戏的画面.时间.进度.敌人的指令等等. cocos2dx为我们提供了定时器schedule相关的操作.其操作函数的定义在CCNode中,所以基本上大多数的引擎类都可以设置定时器,如CCLayer.CCSprite.CCMenu等. 定时器更新的方式分为三类: (1)默认定时器:scheduleUpdate(); (2)自定义定时器:schedule(); (3)一次性定时器:scheduleOnce