cocos2dx-3.12 android/ios监听键盘高度

cocos2dx 3.12版本中,键盘弹出导致界面整体上移,但在聊天界面等场景下需要部分界面跟随键盘移动。通过重写EditBox的`keyboardWillShow`和`keyboardWillHide`方法监听键盘高度。然而在Android平台,此方法并未按预期工作,需要解决Android监听键盘高度事件的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前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不能监听键盘高度事件


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值