【发布时间】:2019-05-19 13:37:46
【问题描述】:
为了在我们的应用程序上收集用户的击键特征,我必须在输入法视图(软键盘)上收集触摸事件(或只是点击时间戳)。
1)据我所知,软键盘的窗口和Activity的窗口是不同的
2)只要能拿到一个视图的窗口,就可以拦截这个窗口的触摸事件。
【问题讨论】:
标签: android window android-softkeyboard android-windowmanager android-input-method
为了在我们的应用程序上收集用户的击键特征,我必须在输入法视图(软键盘)上收集触摸事件(或只是点击时间戳)。
1)据我所知,软键盘的窗口和Activity的窗口是不同的
2)只要能拿到一个视图的窗口,就可以拦截这个窗口的触摸事件。
【问题讨论】:
标签: android window android-softkeyboard android-windowmanager android-input-method
据我所知,键盘窗口属于系统UI,如状态栏或通知窗口;普通应用无法访问 Android 框架中的此类系统窗口。
但是你可以尝试一些棘手的事情来看看它是否能达到你的目的:当软键盘启动时,你可以计算它的高度,然后创建一个新的透明窗口,如 PopupWindow,覆盖键盘的高度相同。这样你就可以拦截键盘上的触摸事件而不阻塞它们。
=== 21/12/2018 更新 ===
请注意,Android 中的所有窗口实际上都是以类似的方式在 ui 框架中实现的。即您的应用程序的应用程序窗口、输入法、状态栏、通知栏...都是窗口,每个窗口都有一个标志来指示窗口类型(阅读here)。简而言之,窗口类型将决定在屏幕上渲染时的窗口 z-index。它们被归类为Application Window、Sub-Window 和System Window。
话虽如此,PopupWindow 只是其中之一,它是 Android 系统提供的一个方便的帮助窗口(相对于 InputMethod 窗口的 z-index 较小)。只需尝试使用WindowManager.addView() 创建您自己的窗口,其中某个窗口类型标志大于 InputMethod 窗口(可能带有TYPE_INPUT_METHOD 标志)。
【讨论】:
window types字段,如你所说,代表z-order,比如TYPE_INPUT_METHOD=FIRST_SYSTEM_WINDOW+11。但是FIRST_SYSTEM_WINDOW上面的所有类型需要特殊权限,除了 FloatingWindow 类型,TYPE_APPLICATION_OVERLAY=FIRST_SYSTEM_WINDOW+38(大于 TYPE_INPUT_METHOD)。所以问题就变成了,如何创建一个透明 FloatingWindow,它可以捕获 TouchEvents,但不会阻止事件的传播。跨度>