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

Android 如何获取keyboard的高度

作者: Miss_Ella | 来源:发表于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