SystemUI布局的分布
在前面的文章有描述到Service起来之后 会通过不同的函数去获取视图.
而不同位置的视图最终通过NavigationBarViewFactory .setupLayoutMapping
初始化的内容
去生成不同的View,更多的内容逻辑就在xml中
public class NavigationBarViewFactory {
private static ArrayMap<Type, Integer> setupLayoutMapping() {
ArrayMap<Type, Integer> map = new ArrayMap<>();
map.put(Type.TOP, R.layout.car_top_navigation_bar);
map.put(Type.TOP_UNPROVISIONED, R.layout.car_top_navigation_bar_unprovisioned);
map.put(Type.BOTTOM, R.layout.car_navigation_bar);
map.put(Type.BOTTOM_LOW, R.layout.car_navigation_bar_low);
map.put(Type.BOTTOM_OPTION, R.layout.car_navigation_bar_option);
map.put(Type.BOTTOM_UNPROVISIONED, R.layout.car_navigation_bar_unprovisioned);
map.put(Type.LEFT, R.layout.car_left_navigation_bar);
map.put(Type.LEFT_UNPROVISIONED, R.layout.car_left_navigation_bar_unprovisioned);
map.put(Type.RIGHT, R.layout.car_right_navigation_bar);
map.put(Type.RIGHT_UNPROVISIONED, R.layout.car_right_navigation_bar_unprovisioned);
return map;
}
}
Type.TOP: 表示视图位于顶部位置。
Type.TOP_UNPROVISIONED: 表示未配置(初始化)的顶部位置,通常用于初始设置向导等。
Type.BOTTOM: 表示视图位于底部位置。
Type.BOTTOM_LOW: 表示位于较低部分的底部位置。
Type.BOTTOM_OPTION: 表示底部位置的可选项。
Type.BOTTOM_UNPROVISIONED: 表示未配置(初始化)的底部位置,类似于 TOP_UNPROVISIONED。
Type.LEFT: 表示视图位于左侧位置。
Type.LEFT_UNPROVISIONED: 表示未配置(初始化)的左侧位置。
Type.RIGHT: 表示视图位于右侧位置。
Type.RIGHT_UNPROVISIONED: 表示未配置(初始化)的右侧位置
以上就是系统启动的时候会初始化的SystemUI所有基础视图.
SystemUI下拉控制面板
下拉控制面板调用栈
at com.android.systemui.car.window.OverlayPanelViewController.setPanelExpanded(OverlayPanelViewController.java:438)
at com.android.systemui.car.window.OverlayPanelViewController.animatePanel(OverlayPanelViewController.java:307)
at com.android.systemui.car.window.OverlayPanelViewController.animateExpandPanel(OverlayPanelViewController.java:267)
at com.android.systemui.car.window.OverlayPanelViewController$OpenGestureListener.onScroll(OverlayPanelViewController.java:594)
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:728)
at com.android.systemui.car.window.OverlayPanelViewController.lambda$new$0$OverlayPanelViewController(OverlayPanelViewController.java:155)
at com.android.systemui.car.window.-$$Lambda$OverlayPanelViewController$pNNGxpoO-myO483wkrx3h5ISEwE.onTouch(Unknown Source:4)
at com.android.systemui.car.navigationbar.CarNavigationBarView.onTouchEvent(CarNavigationBarView.java:121)
下拉整个流程是通过CarNavigationBarView
的onTouch
作为触发点,传递分发事件到OverlayPanelViewController
作为最终执行.执行通过Rect裁切View,来实现下拉的动画效果.
内容承载的View调用链路如下
at com.android.systemui.car.qs.QuickSettingsPanelViewController.reinflate(QuickSettingsPanelViewController.java:145)
at com.android.systemui.car.qs.QuickSettingsPanelViewController.onFinishInflate(QuickSettingsPanelViewController.java:102)
at com.android.systemui.car.window.OverlayViewController.inflate(OverlayViewController.java:73)
at com.android.systemui.car.window.OverlayViewGlobalStateController.inflateView(OverlayViewGlobalStateController.java:305)
at com.android.systemui.car.qs.QuickSettingsPanelViewController.<init>(QuickSettingsPanelViewController.java:81)
at com.android.systemui.car.qs.QuickSettingsPanelViewController_Factory.provideInstance(QuickSettingsPanelViewController_Factory.java:101)
at com.android.systemui.car.qs.QuickSettingsPanelViewController_Factory.get(QuickSettingsPanelViewController_Factory.java:67)
at com.android.systemui.car.qs.QuickSettingsPanelViewController_Factory.get(QuickSettingsPanelViewController_Factory.java:17)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
at com.android.systemui.car.qs.TopQuickSettingsPanelViewMediator_Factory.provideInstance(TopQuickSettingsPanelViewMediator_Factory.java:64)
at com.android.systemui.car.qs.TopQuickSettingsPanelViewMediator_Factory.get(TopQuickSettingsPanelViewMediator_Factory.java:46)
at com.android.systemui.car.qs.TopQuickSettingsPanelViewMediator_Factory.get(TopQuickSettingsPanelViewMediator_Factory.java:12)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
at com.android.systemui.car.window.SystemUIOverlayWindowManager.resolve(SystemUIOverlayWindowManager.java:95)
at com.android.systemui.car.window.SystemUIOverlayWindowManager.resolveContentMediator(SystemUIOverlayWindowManager.java:88)
at com.android.systemui.car.window.SystemUIOverlayWindowManager.startServices(SystemUIOverlayWindowManager.java:65)
at com.android.systemui.car.window.SystemUIOverlayWindowManager.start(SystemUIOverlayWindowManager.java:58)
at com.android.systemui.SystemUIApplication.startServicesIfNeeded(SystemUIApplication.java:204)
at com.android.systemui.SystemUIApplication.startServicesIfNeeded(SystemUIApplication.java:143)
at com.android.systemui.SystemUIService.onCreate(SystemUIService.java:70)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:4186)
at android.app.ActivityThread.access$1500(ActivityThread.java:237)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7664)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
如果需要再控制面板上面新增功能,或者增加按钮可以追溯上述路径修改布局或逻辑代码.
这里有一点需要注意的是contorller
类是通过xml
配置的
相关代码和配置如下
public class SystemUIOverlayWindowManager extends SystemUI {
@Override
public void start() {
String[] names = mContext.getResources().getStringArray(
R.array.config_carSystemUIOverlayViewsMediators);
startServices(names);
}
private <T> T resolve(String className, Map<Class<?>, Provider<T>> creators) {
try {
Class<?> clazz = Class.forName(className);
Provider<T> provider = creators.get(clazz);
return provider == null ? null : provider.get();
} catch (ClassNotFoundException e) {
return null;
}
}
}
<string-array name="config_carSystemUIOverlayViewsMediators" translatable="false">
<!--<item>@string/config_notificationPanelViewMediator</item>-->
<item>@string/config_quicksettingsPanelViewMediator</item>
<item>com.android.systemui.car.keyguard.CarKeyguardViewMediator</item>
<item>com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator</item>
<item>com.android.systemui.car.userswitcher.UserSwitchTransitionViewMediator</item>
</string-array>