为cocos2d-x实现安卓输入框。非全屏,无dialog,绑定到lua
2015-09-18 15:37
666 查看
cocos2d-x官方自带的输入框,简直惨不忍睹,在ios还好,在安卓简直了。。用过的都知道。。。
所以为了用户体验,我们自己搞一个吧。输入框这种东西比较特殊,不像按钮、列表框之类的很容易实现,因为涉及到复制粘贴、操作虚拟键盘等,所以当然是用安卓原生的输入框最好了。
非常感谢我们的主程陈剑大哥,思路是陈剑大哥想的,我只负责记录一下。
本来代码50天前就写好了,但是绑定到js一直失败,恶心了好几天放弃了。前几天在用lua写点东西,把之前的代码拷过来试着绑定到lua,结果一次就成功了,完全没有踩坑,不知道说什么好了。。而且前几天官方发布了cocos2d-x 3.8版本,已经自带了,所以现在再发出来感觉毫无竞争力了呢。。。
使用原生控件的优点不用多说了,缺点当然也是有的。例如排版、布局、屏幕适配等,都要适应cocos2d的规则,而且由于是系统控件,渲染层级不受cocos2d的zorder的影响。当然这些努力一下也是可以解决的。
要注意的有:
1、c++通过jni控制java创建安卓控件。
2、c++持有java对象的引用,防止垃圾回收。
3、java回调c语言,c语言调用c++,所以需要处理好java对象与c++对象的对应关系。
我的做法是:
1、创建一个输入框工厂类,负责根据不同平台生成输入框,当然我只会安卓的。
2、工厂类维护一个map,保存c++对象和java对象的对应关系。
3、根据cocos2d的世界坐标系,更新安卓原生控件。
防止恶意转载还改名的恶心行为。本博客地址:http://www.cnblogs.com/wolfred7464/
上代码吧:
lua_RedBindings_auto.cpp
所以为了用户体验,我们自己搞一个吧。输入框这种东西比较特殊,不像按钮、列表框之类的很容易实现,因为涉及到复制粘贴、操作虚拟键盘等,所以当然是用安卓原生的输入框最好了。
非常感谢我们的主程陈剑大哥,思路是陈剑大哥想的,我只负责记录一下。
本来代码50天前就写好了,但是绑定到js一直失败,恶心了好几天放弃了。前几天在用lua写点东西,把之前的代码拷过来试着绑定到lua,结果一次就成功了,完全没有踩坑,不知道说什么好了。。而且前几天官方发布了cocos2d-x 3.8版本,已经自带了,所以现在再发出来感觉毫无竞争力了呢。。。
使用原生控件的优点不用多说了,缺点当然也是有的。例如排版、布局、屏幕适配等,都要适应cocos2d的规则,而且由于是系统控件,渲染层级不受cocos2d的zorder的影响。当然这些努力一下也是可以解决的。
要注意的有:
1、c++通过jni控制java创建安卓控件。
2、c++持有java对象的引用,防止垃圾回收。
3、java回调c语言,c语言调用c++,所以需要处理好java对象与c++对象的对应关系。
我的做法是:
1、创建一个输入框工厂类,负责根据不同平台生成输入框,当然我只会安卓的。
2、工厂类维护一个map,保存c++对象和java对象的对应关系。
3、根据cocos2d的世界坐标系,更新安卓原生控件。
防止恶意转载还改名的恶心行为。本博客地址:http://www.cnblogs.com/wolfred7464/
上代码吧:
#include "lua_RedBindings_auto.hpp" #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 #include "RedBindings.h" #include "tolua_fix.h" #include "LuaBasicConversions.h" int lua_RedBindings_EditText_setString(lua_State* tolua_S) { int argc = 0; EditText* cobj = nullptr; bool ok = true; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif #if COCOS2D_DEBUG >= 1 if (!tolua_isusertype(tolua_S,1,"EditText",0,&tolua_err)) goto tolua_lerror; #endif cobj = (EditText*)tolua_tousertype(tolua_S,1,0); #if COCOS2D_DEBUG >= 1 if (!cobj) { tolua_error(tolua_S,"invalid 'cobj' in function 'lua_RedBindings_EditText_setString'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; if (argc == 1) { std::string arg0; ok &= luaval_to_std_string(tolua_S, 2,&arg0, "EditText:setString"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditText_setString'", nullptr); return 0; } cobj->setString(arg0); lua_settop(tolua_S, 1); return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "EditText:setString",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditText_setString'.",&tolua_err); #endif return 0; } int lua_RedBindings_EditText_getString(lua_State* tolua_S) { int argc = 0; EditText* cobj = nullptr; bool ok = true; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif #if COCOS2D_DEBUG >= 1 if (!tolua_isusertype(tolua_S,1,"EditText",0,&tolua_err)) goto tolua_lerror; #endif cobj = (EditText*)tolua_tousertype(tolua_S,1,0); #if COCOS2D_DEBUG >= 1 if (!cobj) { tolua_error(tolua_S,"invalid 'cobj' in function 'lua_RedBindings_EditText_getString'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; if (argc == 0) { if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditText_getString'", nullptr); return 0; } std::string ret = cobj->getString(); tolua_pushcppstring(tolua_S,ret); return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "EditText:getString",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditText_getString'.",&tolua_err); #endif return 0; } static int lua_RedBindings_EditText_finalize(lua_State* tolua_S) { printf("luabindings: finalizing LUA object (EditText)"); return 0; } int lua_register_RedBindings_EditText(lua_State* tolua_S) { tolua_usertype(tolua_S,"EditText"); tolua_cclass(tolua_S,"EditText","EditText","cc.Node",nullptr); tolua_beginmodule(tolua_S,"EditText"); tolua_function(tolua_S,"setString",lua_RedBindings_EditText_setString); tolua_function(tolua_S,"getString",lua_RedBindings_EditText_getString); tolua_endmodule(tolua_S); std::string typeName = typeid(EditText).name(); g_luaType[typeName] = "EditText"; g_typeCast["EditText"] = "EditText"; return 1; } int lua_RedBindings_EditTextFactory_getEditTextByJobject(lua_State* tolua_S) { int argc = 0; EditTextFactory* cobj = nullptr; bool ok = true; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif #if COCOS2D_DEBUG >= 1 if (!tolua_isusertype(tolua_S,1,"EditTextFactory",0,&tolua_err)) goto tolua_lerror; #endif cobj = (EditTextFactory*)tolua_tousertype(tolua_S,1,0); #if COCOS2D_DEBUG >= 1 if (!cobj) { tolua_error(tolua_S,"invalid 'cobj' in function 'lua_RedBindings_EditTextFactory_getEditTextByJobject'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; if (argc == 1) { _jobject* arg0; ok &= luaval_to_object<_jobject>(tolua_S, 2, "_jobject",&arg0, "EditTextFactory:getEditTextByJobject"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditTextFactory_getEditTextByJobject'", nullptr); return 0; } EditText* ret = cobj->getEditTextByJobject(arg0); object_to_luaval<EditText>(tolua_S, "EditText",(EditText*)ret); return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "EditTextFactory:getEditTextByJobject",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditTextFactory_getEditTextByJobject'.",&tolua_err); #endif return 0; } int lua_RedBindings_EditTextFactory_createEditText(lua_State* tolua_S) { int argc = 0; EditTextFactory* cobj = nullptr; bool ok = true; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif #if COCOS2D_DEBUG >= 1 if (!tolua_isusertype(tolua_S,1,"EditTextFactory",0,&tolua_err)) goto tolua_lerror; #endif cobj = (EditTextFactory*)tolua_tousertype(tolua_S,1,0); #if COCOS2D_DEBUG >= 1 if (!cobj) { tolua_error(tolua_S,"invalid 'cobj' in function 'lua_RedBindings_EditTextFactory_createEditText'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; if (argc == 0) { if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditTextFactory_createEditText'", nullptr); return 0; } EditText* ret = cobj->createEditText(); object_to_luaval<EditText>(tolua_S, "EditText",(EditText*)ret); return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "EditTextFactory:createEditText",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditTextFactory_createEditText'.",&tolua_err); #endif return 0; } int lua_RedBindings_EditTextFactory_getInstance(lua_State* tolua_S) { int argc = 0; bool ok = true; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif #if COCOS2D_DEBUG >= 1 if (!tolua_isusertable(tolua_S,1,"EditTextFactory",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; if (argc == 0) { if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditTextFactory_getInstance'", nullptr); return 0; } EditTextFactory* ret = EditTextFactory::getInstance(); object_to_luaval<EditTextFactory>(tolua_S, "EditTextFactory",(EditTextFactory*)ret); return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "EditTextFactory:getInstance",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditTextFactory_getInstance'.",&tolua_err); #endif return 0; } static int lua_RedBindings_EditTextFactory_finalize(lua_State* tolua_S) { printf("luabindings: finalizing LUA object (EditTextFactory)"); return 0; } int lua_register_RedBindings_EditTextFactory(lua_State* tolua_S) { tolua_usertype(tolua_S,"EditTextFactory"); tolua_cclass(tolua_S,"EditTextFactory","EditTextFactory","",nullptr); tolua_beginmodule(tolua_S,"EditTextFactory"); tolua_function(tolua_S,"getEditTextByJobject",lua_RedBindings_EditTextFactory_getEditTextByJobject); tolua_function(tolua_S,"createEditText",lua_RedBindings_EditTextFactory_createEditText); tolua_function(tolua_S,"getInstance", lua_RedBindings_EditTextFactory_getInstance); tolua_endmodule(tolua_S); std::string typeName = typeid(EditTextFactory).name(); g_luaType[typeName] = "EditTextFactory"; g_typeCast["EditTextFactory"] = "EditTextFactory"; return 1; } static int lua_RedBindings_EditTextAndroid_finalize(lua_State* tolua_S) { printf("luabindings: finalizing LUA object (EditTextAndroid)"); return 0; } int lua_register_RedBindings_EditTextAndroid(lua_State* tolua_S) { tolua_usertype(tolua_S,"EditTextAndroid"); tolua_cclass(tolua_S,"EditTextAndroid","EditTextAndroid","EditText",nullptr); tolua_beginmodule(tolua_S,"EditTextAndroid"); tolua_endmodule(tolua_S); std::string typeName = typeid(EditTextAndroid).name(); g_luaType[typeName] = "EditTextAndroid"; g_typeCast["EditTextAndroid"] = "EditTextAndroid"; return 1; } TOLUA_API int register_all_RedBindings(lua_State* tolua_S) { tolua_open(tolua_S); tolua_module(tolua_S,"red",0); tolua_beginmodule(tolua_S,"red"); lua_register_RedBindings_EditText(tolua_S); lua_register_RedBindings_EditTextFactory(tolua_S); lua_register_RedBindings_EditTextAndroid(tolua_S); tolua_endmodule(tolua_S); return 1; } #endif
lua_RedBindings_auto.cpp
相关文章推荐
- Cocos Studio的csb文件中clone列表子元素,但动画未随之克隆的分析
- cocos2d-x 3.4 sprite3d c3b 模型无法显示的问题
- cocos2dx 多个精灵执行同一个动作
- Cocos2d-x 学习博客资料
- Cocos2d-x项目脚本的创建
- Quick-cocos2d-x3.3 Study (七)--------- 滚动的背景
- 在Cocos Code IDE里打开cocos2d-x自带的lua测试项目 lua-tests
- cocos2d-js 使用过程中遇到的问题总结
- Quick-cocos2d-x3.3 Study (六)--------- 跳转场景和过渡动画
- Quick-cocos2d-x3.3 Study (四)--------- 添加标题,并上下运动
- Quick-cocos2d-x3.3 Study (三)--------- 创建一个背景
- cocos2dx 数据内存管理----RefPtr智能指针
- Cocos 子节点的渐变失效的处理
- Cocos2d-x从入门到精通第17课《变速动作》
- Cocos2-x从入门到精通第16课《延时动作》
- cocos2d-lua SDK接入
- Cocos2d-x从入门到精通第15课《即时动作》
- 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第十九节:雾
- Cocos2d-x从入门到精通第14课《加速度计》
- xcode7.0 下COCOS2DX编译MAC下出错