FW(CarSystemUI)(二)开发流程

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)

下拉整个流程是通过CarNavigationBarViewonTouch作为触发点,传递分发事件到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>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值