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;
}
网友评论