cocos2dx-3.12 解决android不能监听键盘高度事件
来源:互联网 发布:全民奇迹挂机软件 编辑:程序博客网 时间:2024/06/08 17:47
通过重写cocos2d::ui::EditBox的keyboardWillShow和keyboardWillHide方法可以监听键盘高度。
在iOS平台能实现该功能,但是android平台上运行却不是我们想要的结果,还是键盘弹起时,整个界面往上移动。
通过打印日志,发现EditBoxView重写的keyboardWillShow和keyboardWillHide方法没有被执行,这样就不能监听键盘高度变化。如果想要实现这个功能我们只能修改部分源代码。
找到Cocos2dxEditBoxHelper.java文件,如图:
在73行左右后面添加如下代码:
private static native void keyboardVisibleChanged(int width, int height); public static void __keyboardVisibleChanged(int width, int height){ keyboardVisibleChanged(width, height); } public void observeSoftKeyboard() { final View decorView = mCocos2dxActivity.getWindow().getDecorView(); decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { int keyboardState = -1; int minKeyboardHeight = 0; @Override public void onGlobalLayout() { Rect rect = new Rect(); decorView.getWindowVisibleDisplayFrame(rect); int keyboardHeight = decorView.getHeight() - (rect.bottom - rect.top); boolean hidden = ((double) keyboardHeight / decorView.getHeight()) < 0.2; int state = hidden ? 1 : 0; if (keyboardState != state) { int height = 0; if (state == 1) { minKeyboardHeight = keyboardHeight; } else { height = keyboardHeight - minKeyboardHeight; } final int mWidth = decorView.getWidth(); final int mHeight = height; mCocos2dxActivity.runOnGLThread(new Runnable() { @Override public void run() { Cocos2dxEditBoxHelper.__keyboardVisibleChanged(mWidth, mHeight); } }); keyboardState = state; } } }); }在public Cocos2dxEditBoxHelper(ResizeLayout layout)函数中添加如下代码:
public Cocos2dxEditBoxHelper(ResizeLayout layout) { Cocos2dxEditBoxHelper.mFrameLayout = layout; Cocos2dxEditBoxHelper.mCocos2dxActivity = (Cocos2dxActivity) Cocos2dxActivity.getContext(); Cocos2dxEditBoxHelper.mEditBoxArray = new SparseArray<Cocos2dxEditBox>(); // 监听键盘高度 observeSoftKeyboard(); }打开cocos2d/cocos/ui/UIEditBox/UIEditBoxImpl-android.cpp文件,添加如下代码:
static void editBoxEditingDidBegin(int index);static void editBoxEditingDidChanged(int index, const std::string& text);static void editBoxEditingDidEnd(int index, const std::string& text);static void keyboardVisibleChanged(int width, int height);extern "C"{ JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxEditBoxHelper_editBoxEditingDidBegin(JNIEnv *env, jclass, jint index) { editBoxEditingDidBegin(index); } JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxEditBoxHelper_editBoxEditingChanged(JNIEnv *env, jclass, jint index, jstring text) { std::string textString = StringUtils::getStringUTFCharsJNI(env,text); editBoxEditingDidChanged(index, textString); } JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxEditBoxHelper_editBoxEditingDidEnd(JNIEnv *env, jclass, jint index, jstring text) { std::string textString = StringUtils::getStringUTFCharsJNI(env,text); editBoxEditingDidEnd(index, textString); } JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxEditBoxHelper_keyboardVisibleChanged(JNIEnv *env, jclass, jint width, jint height) { keyboardVisibleChanged(width, height); }}void keyboardVisibleChanged(int width, int height){ auto winSize = cocos2d::Director::getInstance()->getWinSize(); float keyboardHeight = winSize.width * height / (float)width; cocos2d::IMEKeyboardNotificationInfo notiInfo; notiInfo.begin = cocos2d::Rect(0, 0, winSize.width, keyboardHeight); notiInfo.end = cocos2d::Rect(0, 0, winSize.width, keyboardHeight); notiInfo.duration = 0.25; cocos2d::IMEDispatcher* dispatcher = cocos2d::IMEDispatcher::sharedDispatcher(); if (keyboardHeight == 0) { dispatcher->dispatchKeyboardWillHide(notiInfo); } else { dispatcher->dispatchKeyboardWillShow(notiInfo); }}
0 0
- cocos2dx-3.12 解决android不能监听键盘高度事件
- cocos2dx-3.12 android/ios监听键盘高度
- iOS 监听键盘高度,监听键盘出现 收回事件
- android监听键盘事件KeyEvent
- 监听键盘高度
- ios键盘高度监听
- Android 键盘显示/隐藏监听事件
- android监听键盘打开收起事件
- android 监听键盘事件,搜索,确定
- android设备外接键盘实现监听事件
- Android 键盘弹起和回落事件监听
- cocos2dx 事件监听
- cocos2dx Eventdispatch事件监听
- UIKeyboardWillShowNotification 监听键盘高度变化
- UIKeyboardWillShowNotification 监听键盘高度变化
- 监听键盘高度oc---swfit
- javascript监听键盘事件
- javascript监听键盘事件
- hdoj2036 改革春风吹满地——叉积
- 利用中断方式控制树梅派的GPIO
- Java多线程之线程安全与同步实例
- 特殊压缩的解压方法
- 运算符重载
- cocos2dx-3.12 解决android不能监听键盘高度事件
- Linux上使用github简介
- request转发与response重定向(面试题)
- Java中的方法的重写与重载
- CODEVS 1017乘积最大
- ubuntu16.04更换为国内源
- 如何打一手好Log
- 16. 3Sum Closest
- 关于对象运行时方法匹配的问题