美文网首页
Android 如何获取keyboard的高度

Android 如何获取keyboard的高度

作者: Ella_Eric | 来源:发表于2020-09-05 14:35 被阅读0次

Android程序中,键盘弹出或者关闭,有的时候我们需要做一些操作,那么我们怎么才能获取键盘高度呢?目前没找到直接获取的方法,可以采取动态计算的形式:


// 在一个class里面定义以下变量:
private Point previousWindowVisibleSize;
private Point previousViewVisibleSize;
private isPhone; // 是手机还是平板,一般用设备的size来计算,比如最短边小于600dp是手机,大于600dp是平板

// addOnGlobalLayoutListener
contentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                // 分别获取view和view的可见范围
                Rect windowVisibleRect = new Rect();
                getWindowVisibleDisplayFrame(windowVisibleRect);
                Rect viewVisibleRect = new Rect();
                getGlobalVisibleRect(viewVisibleRect);
                // 第一次render,记录初始值
                if(previousWindowVisibleSize == null || previousViewVisibleSize == null) {
                    previousWindowVisibleSize = new Point(windowVisibleRect.width(), windowVisibleRect.height());
                    previousViewVisibleSize = new Point(viewVisibleRect.width(), viewVisibleRect.height());
                    return;
                }

                // 如果view和window的可见size都没有变化,那么键盘也没有显示或者隐藏
                if (previousWindowVisibleSize.x == windowVisibleRect.width() && 
                    previousWindowVisibleSize.y == windowVisibleRect.height() &&
                    previousViewVisibleSize.x == viewVisibleRect.width() && 
                    previousViewVisibleSize.y == viewVisibleRect.height()){
                    return;
                }
                // 如果有变化, 那么可能是旋转或者键盘显示隐藏

                // 键盘显示或者隐藏
                if (previousWindowVisibleSize.x == windowVisibleRect.width() ) {
                    calculateKeyboardHeight();
                }
                else {
                  // 旋转,一般来说旋转会调用 onGlobalLayout()两次,宽度变化和高度变化,但也有只调用一次的情况即高度变化
                  //其他操作
                }
                calculateKeyboardHeight();
                previousWindowVisibleSize.x = windowVisibleRect.width();
                previousWindowVisibleSize.y = windowVisibleRect.height();
                previousViewVisibleSize.x = viewVisibleRect.width();
                previousViewVisibleSize.y = viewVisibleRect.height();
            }
        });


private int calculateKeyboardHeight() {

        DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
        int screenHeight = metrics.heightPixels;
        boolean isPortrait = screenHeight > metrics.widthPixels;

        Rect windowVisibleRect = new Rect();
        getWindowVisibleDisplayFrame(windowVisibleRect);

        Rect viewVisibleRect = new Rect();
        getGlobalVisibleRect(viewVisibleRect);
        int offset = windowVisibleRect.top - viewVisibleRect.top;
        // window和view的起始位置不同,把他们弄到相同的起始位置
        viewVisibleRect.offset(0, offset);

        boolean isKeyboardShowing = false;
        int coverHeight;  //view被挡住的部分
        int keyboardHeight; 

        if (isPhone) {
                // 对于手机来说,view被resize了,他们没有被键盘挡住
                keyboardHeight = screenHeight - viewVisibleRect.bottom
                isKeyboardShowing = keyboardHeight > 0;
                coverHeight = screenHeight - windowVisibleRect.bottom;     
        }
        else {
            // 对于平板来说,window虽然被resize, 但是还是有部分view被keyboard挡住
            keyboardHeight = coverHeight = screenHeight - windowVisibleRect.bottom;
            isKeyboardShowing = keyboardHeight > 0;
        }
     
        return keyboardHeight;

    }

相关文章

网友评论

      本文标题:Android 如何获取keyboard的高度

      本文链接:https://www.haomeiwen.com/subject/vfxjsktx.html