(alps/frameworks/base/core/res/res/values/config.xml)
MTK有集成相关配置,我们只需要修改配置值即可。也可以定位代码手动隐藏或显示。
三,虚拟按键的显示原理及流程
./SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
该类控制Navigation的相关代码。在start()方法中,NavigationBar被添加进去:
在addNavigationBar()具体是实现方法中可以看出来,Navigationbar实际上是windowmanager向Window窗口里添加了一个view。
在调用addNavigationBar()方法之前会回调start()的父方法super.start()来判断是否要添加NavigationBar。在super.start()的调用父类方法里会调用createAndAddWindows(),该方法会判断是否需要显示NavigationBar,然后决定是否要实例化NavigationBarView.
WindowManagerService类实现了WindowManagerPolicy的接口,所以WindowManagerService会回调WindowManagerPolicy的hasNavigationBar()接口。Policy实际上调用的是PhoneWindowManager实现的hasNavigationBar()方法:
public boolean hasNavigationBar(){
return mHasNavigationBar;
}
而mHasNavigationBar的赋值可以在PhoneWindowManager中的setInitialDisplaySize(Display display, int width, int height, int density)方法中找到:
可以看出mHasNavigationBar的值的设定是由两处决定的:
1,在系统的资源文件中取设定值config_showNavigationBar,frameworks/base/core/res/res/values/config.xml
2,系统要获取“qemu.hw.mainkeys”的值,这个值可能会覆盖上面获取到的mHasNavigationBar的值。
综上,隐藏虚拟按键:
1、在OnCreate方法中,myview.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION),此时该Activity显示时会自动隐藏Navigation Bar,但有触摸事件时重新显现。
2、在build.prop文件中,将qemu.hw.mainkeys取值为1,qemu.hw.mainkeys=1隐藏,qemu.hw.mainkeys=0显示。
3、还可以将NavigationBar的高度设置为0,虚拟按键也能隐藏。在framework/base/core/res/res/values/dimens.xml,在其中把Navigation的配置改成0。