目前cocos2dx-3.12版本,键盘弹起时,整个界面往上移动一部分。如图:
但是有时候我们不想要这种效果,比如聊天界面,键盘弹起时只希望部分界面上移,其他不用移动。如图:
这时我们需要监听键盘的高度,所以需要重写cocos2dx::ui::EditBox的如下方法:
virtual void keyboardWillShow(IMEKeyboardNotificationInfo& info)override;
virtual void keyboardWillHide(IMEKeyboardNotificationInfo& info)override;
EditBoxView.h代码
#ifndef __EditBoxView__h__
#define __EditBoxView__h__
#include "cocos2d.h"
#include "ui/CocosGUI.h"
class EditBoxView : public cocos2d::ui::EditBox
{
public:
typedef std::function<void(float height)> ccKeyboardHeightChangedCallback;
// Here's a difference. Method 'init' in cocos2d-x returns bool
virtual bool init(const cocos2d::Size &size);
// implement the "static create()" method manually
static EditBoxView* create(const cocos2d::Size &size);
/**
* 添加键盘变化事件
*
* @param callback 回调事件
*/
void addKeyboardHeightChangedListener(const ccKeyboardHeightChangedCallback &callback) {
_keyboardHeightChangedCallback = callback;
};
#pragma mark - 重写键盘显示或隐藏方法
// 键盘将要显示回调
virtual void keyboardWillShow(cocos2d::IMEKeyboardNotificationInfo& info) override;
// 键盘将要隐藏回调
virtual void keyboardWillHide(cocos2d::IMEKeyboardNotificationInfo& info) override;
protected:
// 键盘变化事件
ccKeyboardHeightChangedCallback _keyboardHeightChangedCallback = nullptr;
};
#endif
EditBoxView.cpp代码
#include "EditBoxView.h"
USING_NS_CC;
using namespace ui;
EditBoxView* EditBoxView::create(const cocos2d::Size &size)
{
EditBoxView* pRet = new (std::nothrow) EditBoxView();
if (pRet && pRet->init(size)) {
pRet->autorelease();
return pRet;
} else {
delete pRet;
pRet = nullptr;
return nullptr;
}
}
bool EditBoxView::init(const cocos2d::Size &size)
{
if (!EditBox::initWithSizeAndBackgroundSprite(size, Scale9Sprite::create())) {
return false;
}
return true;
}
void EditBoxView::keyboardWillShow(IMEKeyboardNotificationInfo& info)
{
if (_keyboardHeightChangedCallback) {
_keyboardHeightChangedCallback(info.end.size.height);
}
}
void EditBoxView::keyboardWillHide(IMEKeyboardNotificationInfo& info)
{
if (_keyboardHeightChangedCallback) {
_keyboardHeightChangedCallback(0);
}
}
在自己用到的地方添加代码:
// 屏幕大小
auto size = Director::getInstance()->getVisibleSize();
// 输入框背景
auto editBoxBg = Scale9Sprite::create("input_bg.png");
editBoxBg->setPreferredSize(Size(size.width, 60));
editBoxBg->setAnchorPoint(Vec2::ANCHOR_MIDDLE_BOTTOM);
editBoxBg->setPosition(size.width * 0.5, 0);
this->addChild(editBoxBg);
// 输入框
auto editBoxView = EditBoxView::create(editBoxBg->getContentSize());
editBoxView->setPosition(editBoxView->getContentSize() * 0.5);
editBoxView->addKeyboardHeightChangedListener([=](float height){
editBoxBg->setPositionY(height);
});
editBoxBg->addChild(editBoxView);
ios平台上顺利运行!!!
但是,android平台上运行却不是我们想要的结果,还是键盘弹起时,整个界面往上移动。
cocos2dx-3.12 解决android不能监听键盘高度事件