cocos2d-x 有关CCEditBox设置除输入框以外的可点击触发区域

感谢点评与关注,欢迎转载与分享。
勤奋努力,持之以恒!

有时在用CCEditBox时,发现输入框比较小,不易玩家点击,用户体验比较差,所以就想通过点击输入框外的其它进行点击触发,下面就给大家介绍如何实现。


.h文件

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
#include "cocos-ext.h"

using namespace std;
using namespace cocos2d;
using namespace extension;

enum{
    backgroundTag = 0,
};

class HelloWorld : public CCLayer, public CCEditBoxDelegate
{
public:
    virtual bool init();
    static cocos2d::CCScene* scene();
    
    CCEditBox* age_edit;
    
    CCEditBox* createEditBox(const CCSize& _size, const char* _imageName, const char* _fontName, int _fontSize,
                                         const ccColor3B& _fontColor, const char* _pText, const ccColor3B& _pColor, int _maxLength,
                             int _inputMode, int _inputFlag);
    
    virtual void editBoxEditingDidBegin(CCEditBox* editBox);
    virtual void editBoxEditingDidEnd(CCEditBox* editBox);
    virtual void editBoxTextChanged(CCEditBox* editBox, const std::string& text);
    virtual void editBoxReturn(CCEditBox* editBox);
    
    
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
    virtual void onEnter();
    virtual void onExit();
    
    CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__

.cpp文件

#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

using namespace cocos2d;
using namespace CocosDenshion;

CCScene* HelloWorld::scene()
{
    CCScene *scene = CCScene::create();
    HelloWorld *layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}

bool HelloWorld::init()
{
    if ( !CCLayer::init() )
    {
        return false;
    }
    
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    
    //添加一背景 当点击此背景时弹出键盘
    CCSprite* background = CCSprite::create("HelloWorld.png");
    background->setScale(2);
    background->setPosition(ccp(size.width*0.5, size.height*0.5));
    this->addChild(background,1,backgroundTag);
    
    //年龄输入框 age
    age_edit = createEditBox(CCSize(size.width*0.8, 100), "green_edit.png", "Marker Felt", 50, ccGREEN, "Age:", ccWHITE, 20, 7, -1);
    age_edit->setDelegate(this);
    age_edit->setEnabled(false); //设置当点击输入框时键盘不弹出
    age_edit->setPosition(ccp(size.width*0.5, size.height*0.5));
    this->addChild(age_edit,1);

    return true;
}


/*
 *_size:        输入框大小(决定框的宽高)
 *_imageName:   输入框底图(可任意大小的图)
 *_fontName:    所输入文字字体
 *_fontSize:    所输入文字大小
 *_fontColor:   所输入文字颜色
 *_pText:       当编辑框中没有任何字符的提示
 *_pColor:      当编辑框中没有任何字符的提示颜色
 *_maxLength:   最大输入文本长度
 *_inputMode:   设置输入键盘模式
 *_inputFlag:   设置输入显示类型
 *
 */
CCEditBox* HelloWorld::createEditBox(const CCSize& _size, const char* _imageName, const char* _fontName, int _fontSize,
                                    const ccColor3B& _fontColor, const char* _pText, const ccColor3B& _pColor, int _maxLength,
                                    int _inputMode, int _inputFlag)
{
    CCEditBox* editBox = CCEditBox::create(_size, CCScale9Sprite::create(_imageName));
    editBox->setFontName(_fontName);
    editBox->setFontSize(_fontSize);
    editBox->setFontColor(_fontColor);
    editBox->setPlaceHolder(_pText);
    editBox->setPlaceholderFontColor(_pColor);
    editBox->setMaxLength(_maxLength);
    
    //使用默认传 -1
    switch (_inputMode) {
        case 0://开启任何文本的输入键盘,包括换行
        {
            editBox->setInputMode(kEditBoxInputModeAny);
        }
            break;
        case 1://开启 邮件地址 输入类型键盘
        {
            editBox->setInputMode(kEditBoxInputModeEmailAddr);
        }
            break;
        case 2://开启 数字符号 输入类型键盘
        {
            editBox->setInputMode(kEditBoxInputModeNumeric);
        }
            break;
        case 3://开启 电话号码 输入类型键盘
        {
            editBox->setInputMode(kEditBoxInputModePhoneNumber);
        }
            break;
        case 4://开启 URL 输入类型键盘
        {
            editBox->setInputMode(kEditBoxInputModeUrl);
        }
            break;
        case 5://开启 数字 输入类型键盘,允许小数点
        {
            editBox->setInputMode(kEditBoxInputModeDecimal);
        }
            break;
        case 6://开启任何文本的输入键盘,不包括换行
        {
            editBox->setInputMode(kEditBoxInputModeSingleLine);
        }
            break;
        case 7://0到9纯数字输入
        {
            editBox->setInputMode(kEditBoxInputModePadNumber);
        }
            break;
        default:
            break;
    }
    
    //使用默认传 -1
    switch (_inputFlag) {
        case 0://密码形式输入
        {
            editBox->setInputFlag(kEditBoxInputFlagPassword);
        }
            break;
        case 1://敏感数据输入、存储输入方案且预测自动完成
        {
            editBox->setInputFlag(kEditBoxInputFlagSensitive);
        }
            break;
        case 2://每个单词首字母大写,并且伴有提示
        {
            editBox->setInputFlag(kEditBoxInputFlagInitialCapsWord);
        }
            break;
        case 3://第一句首字母大写,并且伴有提示
        {
            editBox->setInputFlag(kEditBoxInputFlagInitialCapsSentence);
        }
            break;
        case 4://所有字符自动大写
        {
            editBox->setInputFlag(kEditBoxInputFlagInitialCapsAllCharacters);
        }
            break;
        default:
            break;
    }
    
    //设置返回类型 就是键盘右下角那个键是 return 、Done 、Send 、Search 、Go等字样
    editBox->setReturnType(kKeyboardReturnTypeDone);
    return editBox;
}

//开始编辑
void HelloWorld::editBoxEditingDidBegin(CCEditBox* editBox)
{
    CCLog("Begin");
}
//编辑框文字改变
void HelloWorld::editBoxTextChanged(CCEditBox* editBox, const std::string& text)
{
    CCLog("Changed");
}
//触发return后的回调函数
void HelloWorld::editBoxEditingDidEnd(CCEditBox* editBox)
{
    CCLog("End");
}
//结束编辑
void HelloWorld::editBoxReturn(CCEditBox* editBox)
{
    CCLog("Return");
    CCLog("输入框内容为:%s",editBox->getText());
}


bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    CCSprite* background = (CCSprite*)this->getChildByTag(backgroundTag);
    //当背景被点击时触发键盘弹出
    if (background->boundingBox().containsPoint(pTouch->getLocation())) {
        age_edit->touchDownAction(NULL, NULL); //弹出键盘
    }
    
    return  true;
}
void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){}
void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){}
void HelloWorld::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent){}


void HelloWorld::onEnter()
{
    //事件注册
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
    CCLayer::onEnter();
}
void HelloWorld::onExit()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
    CCLayer::onExit();
}



你可能感兴趣的:(cocos2d-x 有关CCEditBox设置除输入框以外的可点击触发区域)