NavigationBar 分析
说明
Android手机可分为有导航栏以及没导航栏两种,一般有物理按键的机器不会带有导航栏,而没有物理按键的机器则基本会带。这里主要是分析导航栏导航栏的加载以及按键实现。
导航栏的加载以及按键实现
导航栏是属于系统界面的一部分,也就是SystemUI的一部分。
StatusBar.java:
makeStatusBarView():
1 | boolean showNav = mWindowManagerService.hasNavigationBar(); |
createNavigationBar():
1 | mNavigationBarView = NavigationBarFragment.create(mContext, (tag, fragment) -> { |
NavigationBarFragment.java:
onCreate():
1 | inflater.inflate(R.layout.navigation_bar, container, false) |
navigation_bar.xml:
1 | <com.android.systemui.statusbar.phone.NavigationBarView |
NavigationBarView.java: // mRecentIcon
onFinishInflate():
1 | mNavigationInflaterView = (NavigationBarInflaterView) findViewById( |
NavigationBarInflaterView.java:
onFinishInflate():
1 | inflateLayout(getDefaultLayout()); |
inflateButtons():
1 | for (int i = 0; i < buttons.length; i++) { |
inflateButton():
1 | View v = createView(buttonSpec, parent, inflater, landscape); |
createView():
1 | if (HOME.equals(button)) { |
home.xml:
1 | <com.android.systemui.statusbar.policy.KeyButtonView |
KeyButtonView.java:
KeyButtonView():
1 | // id为home以及id为back的KeyButtonView就分别通过systemui:keyCode属性对其进行了设置,设置的值分别是3和4 |
onTouchEvent():
1 | // 当mCode为0的时候,KeyButtonView并不会调用sendEvent方法 |
sendEvent():
1 | mMetricsLogger.write(new LogMaker(MetricsEvent.ACTION_NAV_BUTTON_EVENT) |
NavigationBarFragment.java:
onViewCreated():
1 | prepareNavigationBarView(); |
prepareNavigationBarView():
1 | ButtonDispatcher recentsButton = mNavigationBarView.getRecentsButton(); |
onRecentsClick():
1 | private void onRecentsClick(View v) { |
App实现隐藏导航栏(沉浸式)
MainActivity.java:
1 |
|