有没有办法知道屏幕上显示的键盘的大小?
我正在使用Cocos2dx进行编程,但是我想知道Android部分或Cocos部分的屏幕显示的键盘高度,没关系。
我知道 Keyboard 有一个 getHeight() 方法,但我不想创建新键盘,我想使用默认键盘。
我们这样做了
myLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
parent.getWindowVisibleDisplayFrame(r);
int screenHeight = parent.getRootView().getHeight();
int heightDifference = screenHeight - (r.bottom - r.top);
Log.d("Keyboard Size", "Size: " + heightDifference);
}
});
我们只用键盘调整视图大小,所以我们可以使用它。
Rect r = new Rect();
View rootview = this.getWindow().getDecorView(); // this = activity
rootview.getWindowVisibleDisplayFrame(r);
其结果是您的应用程序在屏幕上使用的空间量(即使未调整活动大小也可以工作)。显然剩余的屏幕空间将被键盘使用(如果它可见)
如果您的活动不是全屏,请使用以下代码:
content.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// TODO Auto-generated method stub
if (keyBoardHeight <= 100) {
Rect r = new Rect();
content.getWindowVisibleDisplayFrame(r);
int screenHeight = content.getRootView()
.getHeight();
int heightDifference = screenHeight
- (r.bottom - r.top);
int resourceId = getResources()
.getIdentifier("status_bar_height",
"dimen", "android");
if (resourceId > 0) {
heightDifference -= getResources()
.getDimensionPixelSize(resourceId);
}
if (heightDifference > 100) {
keyBoardHeight = heightDifference;
}
Log.d("Keyboard Size", "Size: " + heightDifference);
}
// boolean visible = heightDiff > screenHeight / 3;
}
});
如果您想在活动大小不变的情况下计算虚拟键盘高度(adjustPan),那么您可以使用以下示例:
https://github.com/siebeprojects/samples-keyboardheight
它使用隐藏窗口来计算窗口和活动的根视图之间的高度差。
我知道这是一篇旧帖子,但我注意到为我选择的解决方案不适用于所有设备。似乎存在差异,所以我实现了这个,它似乎是一个包罗万象的:
final int[] discrepancy = new int[1];
discrepancy[0] = 0;
// this gets the height of the keyboard
content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
View rootview = activity.getWindow().getDecorView(); // this = activity
rootview.getWindowVisibleDisplayFrame(r);
int screen_height = rootview.getRootView().getHeight();
int keyboard_height = screen_height - (r.bottom + r.top) - discrepancy[0];
if (discrepancy[0] == 0) {
discrepancy[0] = keyboard_height;
if (keyboard_height == 0) discrepancy[0] = 1;
}
int margin_bottom = keyboard_height + Helper.getDp(10, activity);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) carousel_container.getLayoutParams();
params.setMargins(0, 0, 0, margin_bottom);
//boolean visible = heightDiff > screenHeight / 3;
}
});
当第一次调用监听器时,它会在没有键盘的情况下测量屏幕,如果存在差异,我会在下一次考虑它。如果没有差异,我将差异设置为 1,这样它就不再是 0。
在 cocos2d-x 中我们有 CCEditBox。
在 Extensions->GUI->CCEditBox 中,您可以找到 CCEditBox 类。
美妙之处在于它隐藏了在现场其他地方敲击的键盘。并自动向上移动键盘,以防您的编辑框在场景中放置得太低。
如果您使用的是 cocos2d-x v2.1.3,那么您可以导航到示例项目,方法是转到
samples->cpp->TestCpp->Classes->ExtensionTest->EditBoxTest。
从现在开始,我将使用它而不是 CCTextField。昨天刚遇到:)
2020年后,如果你的min SDK大于等于21,你可以通过以下函数查看IME的可见性和高度:
fun isKeyboardVisible(attachedView: View): Boolean {
val insets = ViewCompat.getRootWindowInsets(attachedView)
return insets?.isVisible(WindowInsetsCompat.Type.ime()) ?: false
}
fun getKeyboardHeight(attachedView: View): Int {
val insets = ViewCompat.getRootWindowInsets(attachedView)
return insets?.getInsets(WindowInsetsCompat.Type.ime())?.bottom ?: 0
}
参考:动画键盘(第 1 部分)。用于检查…的新 WindowInsets API 通过克里斯班斯 | 安卓开发者 | 中等的
经过数小时的搜索,如果您想设置,我找到了解决方案windowSoftInput="adjustPan"
这是代码片段:
final View root = findViewById(android.R.id.content);
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
Rect r = new Rect();
{
root.getWindowVisibleDisplayFrame(r);
}
@Override
public void onGlobalLayout() {
Rect r2 = new Rect();
root.getWindowVisibleDisplayFrame(r2);
int keyboardHeight = r.height() - r2.height();
if (keyboardHeight > 100) {
root.scrollTo(0, keyboardHeight);
}
else {
root.scrollTo(0, 0);
}
}
});
在此代码中,在找到键盘高度后,我将视图向上滚动到键盘未覆盖,这是查找键盘高度的主要原因。
根据文档:
void getWindowVisibleDisplayFrame(Rect outRect)
:检索此视图附加到的窗口所在的整体可见显示大小。
android 显示屏幕的 ROOT_VIEW 可以被可视化为单个屏幕视图,其中包含显示活动视图的 VISIBLE DISPLAY FRAME。
当软键盘在屏幕上显示或隐藏时,会调整此可见显示框架。
注意:请通过单击下面给出的链接查看这两个图像以更好地理解
因此,显示屏的 ROOT VIEW 可以可视化为: 显示屏的 RootView
VISIBLE DISPLAY FRAME 随着 SOFT KEYBOARD 的打开和关闭的调整可视化为: VISIBLE_DISPLAY_SCREEN 调整
VISUAL DISPLAY FRAME 的这种调整可以很好地用于找出键盘的高度:
(软键盘打开时)
SOFT_KEYBOARD_HEIGHT = ROOT_VIEW_HEIGHT - (VISUAL_DISPLAY_FRAME_HEIGHT + EXTRA_SCREEN_HEIGHT)
实现上述的代码是:
int mExtraScreenHeight=-1, mKeyboardHeight=-1;
boolean mKeyboardOpen;
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int rootViewHeight, visibleDisplayFrameHeight, fakeHeight;
/* (rootViewHeight - visibleDisplayFrameHeight) is not the real height of the keyboard
it is the fake height as it also consist of extra screen height
so FAKE_HEIGHT = KEYBOARD_HEIGHT + EXTRA_SCREEN_HEIGHT
To get keyboard height extra screen height must be removed from fake height
*/
Rect rect = new Rect();
rootView.getWindowVisibleDisplayFrame(rect);
rootViewHeight = rootView.getRootView().getHeight();
visibleDisplayFrameHeight = rect.height();
fakeHeight = rootViewHeight-visibleDisplayFrameHeight;
if (mExtraScreenHeight == -1){
mExtraScreenHeight=fakeHeight;
}
/* Suppose the soft keyboard is open then the VISIBLE_DISPLAY_FRAME is in reduced size
due to the space taken up by extra screen and the keyboard but when the soft keyboard closes
then KEYBOARD_HEIGHT=0 and thus FAKE_HEIGHT = EXTRA_SCREEN_HEIGHT
*/
else if (fakeHeight <= mExtraScreenHeight){
mExtraScreenHeight=fakeHeight;
mKeypadOpen=false;
}
else if (fakeHeight > mExtraScreenHeight){
mKeypadHeight=fakeHeight-mExtraScreenHeight;
mKeypadOpen=true;
}
}
});
注意: onGlobalLayout() 函数只会在全局布局发生变化时调用,比如软键盘打开时。所以软键盘必须至少打开一次才能获得软键盘高度。
它对我有用;)
抱歉无法发表评论,其中两个或三个答案帮助我解决了我的问题,它们与使用 AddOnGlobalLayoutListener 然后确定键盘出现前后的剩余高度有关。
我使用的解决方案基于 Rudy_TM 的回答。
但是,我必须找到的一件事是,为了使该方法起作用,您必须在某处具有以下行
Window.SetSoftInputMode(SoftInput.AdjustResize);
在我有 SoftInput.AdjustNothing (或类似的东西)之前,它不起作用。现在它完美无缺。感谢您的回答!
完整的答案并为我完美工作:
Rect r = new Rect();
View rootview = this.getWindow().getDecorView(); // this = activity
rootview.getWindowVisibleDisplayFrame(r);
int keyboardHeight = rootview.getHeight() - r.bottom;