试图制作一个透明的Android InputMethod - 即底层内容显示到我正在开发的键盘。
我已经能够使传递给系统的视图变得透明——我认为——但在我的视图下面似乎有一些东西是纯白色的——并且混淆了底层内容。
绝对有可能,这些人做到了:
试图制作一个透明的Android InputMethod - 即底层内容显示到我正在开发的键盘。
我已经能够使传递给系统的视图变得透明——我认为——但在我的视图下面似乎有一些东西是纯白色的——并且混淆了底层内容。
绝对有可能,这些人做到了:
我想到了!不确定这是否是您的游戏商店链接中的人所做的,但这对我有用。另外,我意识到这篇文章已有一年多的历史了,但我仍在回答它,以防万一其他人在尝试创建透明键盘时发现了这一点。
你眼中的“某物”实际上什么都不是——它是一片空白。您的键盘将整个视图向上推开,为其高度腾出空间,留下空白区域。您的透明键盘让这个空白区域显示出来。
这是解决方案:不要在 onCreateInputView 中返回您的视图,而是在 onCreateCandidatesView 中返回它。这是通常位于键盘上方并列出自动更正建议的视图。但是您将使用它来容纳您的实际键盘。
你想让你的键盘成为候选视图的原因是输入视图通常会向上推底层视图。当通过 android:windowSoftInputMode 显示键盘并且输入视图尊重他们的偏好时,各个应用程序可以决定他们希望如何表现,但候选视图总是使用 adjustPan。
来自文档:“请注意,由于候选视图倾向于显示和隐藏很多,它不会像软输入视图那样影响应用程序 UI:它永远不会导致应用程序窗口调整大小,只会导致它们如果需要用户可以平移以查看当前焦点。” http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html
因此,从 onCreateCandidatesView 返回透明视图,从 onCreateInputView 返回 null 并确保调用 setCandidatesViewShown(true) 以便显示候选视图(我在 onWindowShown 中调用它)。
通常 InputMethodServices 使用与当前绑定应用程序的背景颜色相同的背景颜色。如果你想让这个透明,我认为你应该把它做成弹出窗口结构,而不是我认为的输入法窗口。
仅当您非常熟悉InputMethodService
.
额外区域的 id 名称为fullscreenArea,您可以获取该区域的 id,然后 findViewById() 设置其背景。
在我练习之前,键盘看起来像这样:
一个巨大的空白封面下面的页面。
所以之后是:
您可以看到下面的页面,其中包含一个 EditText 和其他显示。
这是我的代码:
public static void makeKeyboardTransparent(InputMethodService service) {
try {
View decorView = service.getWindow().getWindow().getDecorView();
final int viewId = fetchInternalRId("fullscreenArea");
View fullscreenArea = decorView.findViewById(viewId);
if (fullscreenArea != null) {
modifyView(fullscreenArea);
return;
}
} catch (Exception e) {
}
try {
Class<?> superClass = service.getClass().getSuperclass();
Field fullscreenAreaField = superClass.getDeclaredField("mFullscreenArea");
fullscreenAreaField.setAccessible(true);
View fullscreenArea = (View) fullscreenAreaField.get(service);
if (fullscreenArea != null) {
modifyView(fullscreenArea);
}
} catch (Exception e) {
}
}
private static void modifyView(View fullscreenArea) {
fullscreenArea.setBackgroundColor(Color.TRANSPARENT);
}
private static int fetchInternalRId(String name) throws Exception {
Class<?> rIdClass = Class.forName("com.android.internal.R$id");
return rIdClass.getDeclaredField(name).getInt(rIdClass);
}
我提供了两种使空白区域透明的方法,它们在我的测试中都运行良好,您所需要的只是将您的 InputMethodService 传递给makeKeyboardTransparent()
它,看看它可以做什么。