您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
安卓判断键盘是否打开
发布时间:2021-07-03 12:06:05编辑:雪饮阅读()
在安卓中,如果有用到editText并且同时使用了自定义view以实现边角拖拽、缩放等特效。
那么此时在editText操作之后就会发现这个自定义的可拖拽的view就会重新绘制到初始位置。
对于此,目前相对简单的做法来说就是在键盘打开的时候记录下最后绘制的位置、大小等信息,然后等键盘隐藏/收下去的时候重新读取打开时候记录下的这些位置、大小等信息并重新对view进行操作。
那么键盘的大小的获取,对于安卓目前api来说没有一个非常优雅的,可以说是直接没有这种api。
那么这里觉得相对简单的,就是通过可视区域纵坐标的变化来判断,当键盘弹出时候,其实安卓中键盘的实现就是一个非常类似dialog的东西,甚至可以说就是一个dialog。
当键盘弹起的时候可视区域的纵坐标会减少,可以利用原来的纵坐标减去这个现在的纵坐标就得到了键盘的高度,然后设定一个阈值,我这里测试键盘高度大概占用了35%.
封装一个判断键盘是否打开的方法,如:
public boolean keyboardIsShow(){
View decorView = getWindow().getDecorView();
Rect outRect = new Rect();
decorView.getWindowVisibleDisplayFrame(outRect);
int corb = outRect.bottom;
//获取到键盘高度
int difference = orb-corb;
DecimalFormat df = new DecimalFormat("0.00");
float ratio = (float)corb / orb;
float keyboardRatio = (float)difference / orb;
Log.i("比率", "原来的:"+String.valueOf(orb));
Log.i("比率", "现在的:"+String.valueOf(corb));
Log.i("比率", String.valueOf(ratio));
Log.i("比率", "键盘高度比率:"+String.valueOf(keyboardRatio));
//设定一个比较的阈值(假如这里设定为0.3)
if(keyboardRatio>0.3){
return true;
}
return false;
}
View decorView = getWindow().getDecorView();
Rect outRect = new Rect();
decorView.getWindowVisibleDisplayFrame(outRect);
int corb = outRect.bottom;
//获取到键盘高度
int difference = orb-corb;
DecimalFormat df = new DecimalFormat("0.00");
float ratio = (float)corb / orb;
float keyboardRatio = (float)difference / orb;
Log.i("比率", "原来的:"+String.valueOf(orb));
Log.i("比率", "现在的:"+String.valueOf(corb));
Log.i("比率", String.valueOf(ratio));
Log.i("比率", "键盘高度比率:"+String.valueOf(keyboardRatio));
//设定一个比较的阈值(假如这里设定为0.3)
if(keyboardRatio>0.3){
return true;
}
return false;
}
当然,在界面刚onCreate的时候就需要先初始化下原始的纵坐标
另外需要注意下,我这里在onCreate中执行了下面这行代码:
这个代码是防止键盘出来后遮住了输入框editText,如果editText越靠最底部,则越容易被遮挡住,如果执行了这行代码就会使得键盘出来后不是以遮挡输入框的方式(这里说的遮挡是对于正在输入的EditText,如果正在输入的EditText本来就是在可视区域,即键盘遮住了布局后仍然能看到,那么就默认也不会遮挡的)而是将整体布局向上推。
Rect outRect = new Rect();
decorView.getWindowVisibleDisplayFrame(outRect);
orb=outRect.bottom;
这里没有尝试把这行代码去除之后是否有影响,不过这里我要的就是这行代码的效果,所以也就没有必要研究去除这行代码之后的效果了。
关键字词:安卓