
前言
从 Android 12开始,如果是大屏底下导航栏会变成显示一个任务栏,从 NavigationBar 变成 Taskbar 。
注:CentralSurfacesImpl.java 与 原来的 statusbar.java 的作用一样。
CentralSurfacesImpl 的启动流程前面有说过,这里不在说明。
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
1 | public class CentralSurfacesImpl extends CoreStartable implements |
接着往下看:
NavigationBarController#createNavigationBars()
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
1 | public void createNavigationBars(final boolean includeDefaultDisplay, |
我们分析平板,所以这里直接看 mTaskbarDelegate.init(mContext.getDisplayId()) 方法;
TaskbarDelegate#init()
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java
1 | public void init(int displayId) { |
1. 手势加载
EdgeBackGestureHandler#onNavBarAttached()
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
1 | /** |
到此手势导航创建完成。
注意:此时 View 还是不可见的,后续事件产生的时候会进行展示和刷新
下面粗略的看下手势相关的事件:
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
1 | private void onMotionEvent(MotionEvent ev) { |
事件间传递到 NavigationBarEdgePanel ,进行展示返回手势和触发返回。
NavigationBarEdgePanel 继续进行后面的工作:手势的判断、视图的刷新、动画的展示。
onMotionEvent() 的逻辑:
- DOWN 的时候先让视图变为可见 VISIBLE
- MOVE 的处理通过 handleMoveEvent() 判断距离,决定是否要更新赋予 mTriggerBack
- UP 的时候将检查该变量决定是否触发返回动作即 triggerBack()
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
1 | public void onMotionEvent(MotionEvent event) { |
手势相关的事件流程到此打住了。
2. 按钮导航
按钮导航是在 TouchInteractionService.java 中的 onCreate() 方法开始的。
packages/apps/Launcher3/quickstep/src/com/android/quickstep/TouchInteractionService.java
1 |
|
用户配置完成后,根据配置,是否加载按钮导航。如果加载则会调用 TaskbarManager.java 中的 recreateTaskbar() 方法。
TaskbarManager#recreateTaskbar()
packages/apps/Launcher3/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
1 | private void recreateTaskbar() { |
在 TaskbarManager 类中有个 mDispInfoChangeListener 的监听,当导航模式切换时,会在 DisplayController 类中 去回调这里来。
接着往下看TaskbarActivityContext的构造方法:
1 | public TaskbarActivityContext(Context windowContext, DeviceProfile dp, |
这里以 NavbarButtonsViewController 为例子分析:
packages/apps/Launcher3/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
1 | /** |
事件的在 addButton() 的时候直接设置了,而且有特殊需求的,会单独设置。
本文链接:
http://longzhiye.top/2024/02/12/2024-02-12/