Android KeyEvent分发机制及解决点击穿透问题

前言
2016年年底,给一个App适配了D-pad,D-pad就是下图红框里的东西:
[图片]
诺基亚手机D-pad
对App来说,触摸触摸屏产生的是TouchEvent,按D-pad产生的是KeyEvent。
KeyEvent分发机制
Android系统提供了一套事件分发机制,负责将事件分发到合适的组件进行处理。KeyEvent分发机制也是如此,它遵循以下步骤将KeyEvent分发到合适的组件:
事件首先分发到当前Activity的根View。
根View根据事件类型和目标View来确定是否消费该事件。
如果根View消费了该事件,则该事件不会再分发到子View。
如果根View没有消费该事件,则该事件会继续分发到根View的子View。
子View根据事件类型和目标View来确定是否消费该事件。
如果子View消费了该事件,则该事件不会再分发到子View的子View。
如果子View没有消费该事件,则该事件会继续分发到子View的子View。
如此反复,直到事件被消费或者分发到最底层的View。
事件冲突与消费
在KeyEvent分发过程中,可能会出现事件冲突的情况。比如,一个View想要消费该事件,但它的父View也想要消费该事件。在这种情况下,系统会根据以下规则来确定谁来消费该事件:
如果父View和子View都对该事件感兴趣,则父View会消费该事件。
如果父View对该事件不感兴趣,但子View对该事件感兴趣,则子View会消费该事件。
如果父View和子View都对该事件不感兴趣,则该事件会被丢弃。
焦点切换
当用户在Android设备上输入文字时,系统会将焦点切换到当前正在输入的控件上。焦点切换可以通过以下方式进行:
用户直接点击控件。
用户使用方向键或其他导航键来切换焦点。
系统自动将焦点切换到某个控件上。
解决点击穿透问题
在某些情况下,用户可能会遇到点击穿透问题。比如,用户点击一个按钮,但实际上点击到了按钮下面的另一个控件。这可能是由于以下原因造成的:
按钮的透明度设置为0,导致按钮下面的控件可以被点击。
按钮的点击区域太小,导致用户很难点击到按钮。
按钮的父控件设置了clickable属性,导致按钮下面的控件也可以被点击。
为了解决点击穿透问题,可以采取以下措施:
将按钮的透明度设置为1,确保按钮下面的控件不可见。
将按钮的点击区域设置得足够大,确保用户可以轻松点击到按钮。
将按钮的父控件的clickable属性设置为false,确保只有按钮可以被点击。