导航栏有返回(back),桌面(home),最近任务(recent),本篇主要学习这三个是如何加载的,点击事件在哪里写的?基于 AOSP 9.0 分析。
NavigationBar 创建是从 StatusBar#makeStatusBarView 开始的。
StatusBar#makeStatusBarView
|
|
再进入 NavigationBarFragment#create 看看。
NavigationBarFragment#create
|
|
这里 WindowManager addView 了导航栏的布局,最终 add NavigationBarFragment,接下来看 NavigationBarFragment#onCreateView
NavigationBarFragment#onCreateView
|
|
看下布局文件 navigation_bar.xml,这是导航栏的真正根布局。
navigation_bar.xml
位于 SystemUI\res\layout\navigation_bar.xml
NavigationBarInflaterView 继承自 FrameLayout,直接看 onFinishInflate() 方法,这个方法是每个 view 被 inflate 之后都会回调。
NavigationBarInflaterView#onFinishInflate
|
|
这里调用了 getDefaultLayout 方法,加载资源文件。
NavigationBarInflaterView#getDefaultLayout
|
|
config_navBarLayoutQuickstep 和 config_navBarLayout 位于 AOSP/frameworks/base/packages/SystemUI/res/values/config.xml。
回头再看 NavigationBarInflaterView#onFinishInflate 方法调用 NavigationBarInflaterView#inflateLayout 方法。
NavigationBarInflaterView#inflateLayout
|
|
再看 inflateButtons() 方法,遍历加载 inflateButton。
NavigationBarInflaterView#inflateButtons
|
|
来看 NavigationBarInflaterView#createView 方法。
以 home 按键为例,加载了 home.xml 布局。
从 KeyButtonView#sendEvent() 方法来看,home 等 view 的点击 touch 事件不是自己处理的,而是交由系统以实体按键(keycode)的形式处理的,不细看了。
那 NavigationBar icon 是具体如何加载的?看 NavigationBarView 构造方法。
NavigationBarView#构造方法
|
|
NavigationBarView#reloadNavIcons
|
|
这里看到 NavigationBar icon 加载,点击事件在哪里写了呢?看 NavigationBarFragment#onViewCreated。
NavigationBarFragment#onViewCreated
|
|
从 mButtonDispatchers 获得 recents、back、home,然后设置点击、长按等事件,比如 onRecentsClick 方法:
至此,SystemUI NavigationBar 模块代码流程分析完毕。