目前只做了android
实现效果:如果软键盘挡住了editbox则移动游戏界面到能刚好能看到的位置
思路:
1.js端获取点击的editbox的世界坐标
2.调整GLSurfaceView的y坐标
creator版本:2.3.3
1.js端代码
cc.EditBox.prototype._onTouchBegan=function(event){
let touch=event.touch
let node=event.target
let upLoadY=touch.getLocationY()
let nodePos=node.convertToNodeSpaceAR(touch.getLocation())
upLoadY-=nodePos.y+node.height/2
if(cc.sys.isNative){
if(cc.sys.os==cc.sys.OS_ANDROID){
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "upLoadEditBoxY", "(Ljava/lang/String;)V",upLoadY*cc.view.getScaleY())
}else{
}
}
}
2. android端代码
Cocos2dxActivity.java
添加静态变量用于接收js端传递过来的值
public static float mEditBoxY=0;
修改软键盘的弹出方式
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Cocos2dxEditBox.java
修改registKeyboardVisible方法
private void registKeyboardVisible() {
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
getWindowVisibleDisplayFrame(r);
int heightDiff = getRootView().getHeight() -(r.bottom-r.top);
// if more than a quarter of the screen, its probably a keyboard
if (heightDiff > mScreenHeight/4) {
if (!keyboardVisible) {
keyboardVisible = true;
if(heightDiff>Cocos2dxActivity.mEditBoxY){
GLSurfaceView gl=mActivity.getGLSurfaceView();
Log.i(TAG, "Cocos2dxActivity.mEditBoxY: "+Cocos2dxActivity.mEditBoxY);
float moveY=-(heightDiff-Cocos2dxActivity.mEditBoxY);
gl.setY(moveY);
}
}
} else {
if (keyboardVisible) {
keyboardVisible = false;
Cocos2dxEditBox.this.hide();
GLSurfaceView gl=mActivity.getGLSurfaceView();
gl.setY(0);
}
}
}
});
}
修改Additems方法
private void addItems(Cocos2dxActivity context, FrameLayout layout) {
RelativeLayout myLayout = new RelativeLayout(context);
this.addEditText(context, myLayout);
this.addButton(context, myLayout);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
layout.addView(myLayout, layoutParams);
}
3.隐藏自带的输入框,这里只是调整了下view的添加顺序,让游戏界面挡住了输入框
修改Cocos2dxActivity.java中的ini方法
mEditBox = new Cocos2dxEditBox(this, mFrameLayout);
Cocos2dxRenderer renderer = this.addSurfaceView();
4.在AppActivity.java中添加静态方法
public static void upLoadEditBoxY(String y){
mEditBoxY=Float.parseFloat(y);
}
好了,大概是这样的了,吐槽下这个发帖子的工具好难用啊