Android R中虚拟按键的详细设计与实现 虚拟按键被Google设计在SystemUi当中,他的入口是NavigationBarFragment.java类。在Google的设计中,虚拟按键并不是在驱动测直接上报,而是利用触屏事件转化为按键事件,然后将这些事件当成实体按键去处理。这种设计用很小的性能、功耗换功能的设计是存在一定的缺陷的。 整个虚拟按键的原理描述如下:在systemUI加载中向系统中添加了虚拟按键的窗口,在窗口中加载了对应的按钮布局。当用手指点击HOME键区域时,系统会将触屏事件,通过驱动写入的dev/input下。系统通过InputReader和InputDispathcer对触屏事件进行分发。直到事件分发给对应的KeyButtonView的onTouchEvent中,在该方法中利用IMS调用InputDispathcer的inject的注入事件的接口,将HOME、BACK、菜单等按键,注入到系统中,进行二次分发,将具体事件进行消费。 整个虚拟按键的创建和添加是从base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java开始的,在这个类中最终调用了createNavigationBar方法。 在base/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java的createNavigationBar方法中创建了NavigationBarFramgment如下图所示: 这是一个继承自LifecycleFragment的Fragment。在这里面定义了手势和虚拟按键的模式。以及虚拟按键背景透明度变化等情况,base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java。如下图: