EditBox软键盘挡住游戏界面的问题的一些解决方案

目前只做了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);
    }

好了,大概是这样的了,吐槽下这个发帖子的工具好难用啊

大佬 js部分代码是写在哪里的,,

游戏初始化里面加上就好了