Android自定义输入法开发:实现可自由放置且不拦截底层交互的按钮
Android自定义输入法开发:实现可自由放置且不拦截底层交互的按钮
最近我正在开发一款Android自定义输入法,核心需求特别有意思——让键盘的按钮“悬浮到屏幕边缘”,而按钮之间的区域要允许用户和底层的应用直接交互,也就是说点中间空白处的时候,事件能透传到下面的APP,不会被输入法拦下来。
想象一下这个布局大概是这样的:
+-----------------------+ | | | +--------+ | | | | | | | | | |+----+ | | +----+ || L | | 可交互区域 | | R | |+----+ | | +----+ | | | | | +--------+ | +-----------------------+
左边的L按钮和右边的R按钮是输入法的功能按钮,稳稳“贴”在屏幕边缘,中间的大片区域完全不拦截触摸操作,用户点这里的时候,底层应用该干啥干啥,完全不受输入法影响。
我梳理了几个实现的关键点,给你参考:
- 自定义布局结构:输入法的主容器别用全屏的LinearLayout或者类似的,改用FrameLayout或者RelativeLayout,把按钮固定在左右边缘,中间留空。这样布局本身就不会强制覆盖整个屏幕区域。
- 触摸事件精准拦截:重写输入法View的
dispatchTouchEvent或者onTouchEvent方法,每次触摸事件进来,先判断触摸点是不是在按钮的范围内。如果是,就处理按钮的点击逻辑;如果不是,直接返回false,把事件“放过去”给底层应用。 - 调整输入法窗口属性:在
InputMethodService里,得给输入法窗口做些配置——比如设置透明背景,调整窗口大小为自适应(不要全屏),还可以通过WindowManager.LayoutParams来设置窗口的位置和显示模式,确保它不会挤压底层应用的布局。比如不想让应用布局上移的话,可以在Manifest里给对应的Activity设置android:windowSoftInputMode="adjustNothing"。 - 边缘按钮的适配:不同屏幕尺寸下,按钮的位置要做好适配,可以用百分比布局或者约束布局,保证按钮始终贴在边缘,不会错位。
给你贴个简单的触摸事件处理代码示例,一看就懂:
@Override public boolean onTouchEvent(MotionEvent event) { float touchX = event.getX(); float touchY = event.getY(); // 检查左侧按钮是否被点击 Rect leftBtnRect = new Rect(); leftButton.getHitRect(leftBtnRect); if (leftBtnRect.contains((int)touchX, (int)touchY)) { leftButton.performClick(); return true; } // 检查右侧按钮是否被点击 Rect rightBtnRect = new Rect(); rightButton.getHitRect(rightBtnRect); if (rightBtnRect.contains((int)touchX, (int)touchY)) { rightButton.performClick(); return true; } // 不在按钮区域,透传事件给底层应用 return false; }
这样写的话,只有点到左右按钮时输入法才会响应,中间区域的触摸事件会直接传递给下面的APP,完美实现需求。
内容来源于stack exchange
相关产品推荐
相关产品推荐

