关于cocos2dx的textfield事件响应

time:2015/08/27

1. textfiled

  cocostudio的输入框,看源代码知道他是直接继承widget的,但是真正的输入框功能是label实现的,是Textfield类的一个成员变量

2. addEventListener

  注册函数对应的四个事件类型

(1)attach_with_ime

  焦点进入

(2)detach_with_ime

  焦点离开

(3)insert_text

  输入文字

(4)delete_backward

  输出文字

3. 事件触发机制

(1)touch:包括attach和detach

复制代码
bool TextField::onTouchBegan(Touch *touch, Event *unusedEvent)
{
    bool pass = Widget::onTouchBegan(touch, unusedEvent);
    if (_hitted)
    {
        _textFieldRenderer->attachWithIME();
    } else {
        this->didNotSelectSelf();
    }
    return pass;
}
复制代码

* 点击输入框其实就是触摸事件,然后判断当前焦点状态,做出进入还是离开的事件触发
(2)insert和delete

void TextFieldTTF::insertText(const char * text, size_t len);
void TextFieldTTF::deleteBackward();

* 直接从glfw触发调用到这两个函数

(3)流程图

(4)问题

*描述: attach响应之后detach也会响应一次

*解决:修改update函数,参考cocos2dx-3.6

修改之前代码:

复制代码
void TextField::update(float dt)
{
    if (getAttachWithIME())
    {
        attachWithIMEEvent();
        setAttachWithIME(false);
    }
    if (getDetachWithIME())
    {
        detachWithIMEEvent();
        setDetachWithIME(false);
    }
复制代码

修改之后的代码:

复制代码
void TextField::update(float dt)
{
    if (getDetachWithIME())
    {
        detachWithIMEEvent();
        setDetachWithIME(false);
    }
    
    if (getAttachWithIME())
    {
        attachWithIMEEvent();
        setAttachWithIME(false);
    }
复制代码

 

4. 总结

(1)认识了TextFieldTTF的事件响应

(2)在此基础上加光标等内容会更加得心应手

posted @   上山老人  阅读(3518)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示