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)在此基礎上加光標等內容會更加得心應手