专栏首页吴小龙同學Android 9.0 SystemUI 主要视图 SystemBars

Android 9.0 SystemUI 主要视图 SystemBars

SystemBars 是 SystemUI 主要视图,接下来看看它是如何呈现?基于 AOSP 9.0 分析。

SystemBars#start

SystemBars 启动中 mServices[i].start() 将调用 SystemBars.start():

public class SystemBars extends SystemUI {
    //省略部分代码
    private SystemUI mStatusBar;
    @Override
    public void start() {
        if (DEBUG) Log.d(TAG, "start");
        createStatusBarFromConfig();
    }
    //省略部分代码
    private void createStatusBarFromConfig() {
        if (DEBUG) Log.d(TAG, "createStatusBarFromConfig");
        final String clsName = mContext.getString(R.string.config_statusBarComponent);
        if (clsName == null || clsName.length() == 0) {
            throw andLog("No status bar component configured", null);
        }
        Class<?> cls = null;
        try {
            cls = mContext.getClassLoader().loadClass(clsName);
        } catch (Throwable t) {
            throw andLog("Error loading status bar component: " + clsName, t);
        }
        try {
            mStatusBar = (SystemUI) cls.newInstance();
        } catch (Throwable t) {
            throw andLog("Error creating status bar component: " + clsName, t);
        }
        mStatusBar.mContext = mContext;
        mStatusBar.mComponents = mComponents;
        mStatusBar.start();
        if (DEBUG) Log.d(TAG, "started " + mStatusBar.getClass().getSimpleName());
    }
    //省略部分代码
}

这里 config_statusBarComponent 在 AOSP/frameworks/base/packages/SystemUI/res/values/config.xml 里,值为:

<string name="config_statusBarComponent" translatable="false">com.android.systemui.statusbar.phone.StatusBar</string>

上面 mStatusBar.start() 通过反射机制 start 了 StatusBar。

StatusBar#start

@Override
public void start() {
    mGroupManager = Dependency.get(NotificationGroupManager.class);
    mVisualStabilityManager = Dependency.get(VisualStabilityManager.class);
    mNotificationLogger = Dependency.get(NotificationLogger.class);
    //省略部分代码,主要是实例化
    //创建并添加视图
    createAndAddWindows();
    //省略其他代码
}

StatusBar#addStatusBarWindow

看 createAndAddWindows 方法,又调了 addStatusBarWindow:

public void createAndAddWindows() {
    addStatusBarWindow();
}
private void addStatusBarWindow() {
    makeStatusBarView();
    //省略其他代码
}

StatusBar#makeStatusBarView

makeStatusBarView 是关键方法,创建 StatusBarView,makeStatusBarView 内容很多,本篇先看布局部分:

protected void makeStatusBarView() {
    final Context context = mContext;
    updateDisplaySize(); // populates mDisplayMetrics
    updateResources();
    updateTheme();
    //对应布局文件:super_status_bar.xml
    inflateStatusBarWindow(context);
    //省略其他代码
}

StatusBar#inflateStatusBarWindow

protected void inflateStatusBarWindow(Context context) {
    mStatusBarWindow = (StatusBarWindowView) View.inflate(context,
            R.layout.super_status_bar, null);
}

super_status_bar.xml

<com.android.systemui.statusbar.phone.StatusBarWindowView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:sysui="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
    <com.android.systemui.statusbar.BackDropView
            android:id="@+id/backdrop"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone"
            sysui:ignoreRightInset="true"
            >
        <ImageView android:id="@+id/backdrop_back"
                   android:layout_width="match_parent"
                   android:scaleType="centerCrop"
                   android:layout_height="match_parent" />
        <ImageView android:id="@+id/backdrop_front"
                   android:layout_width="match_parent"
                   android:layout_height="match_parent"
                   android:scaleType="centerCrop"
                   android:visibility="invisible" />
    </com.android.systemui.statusbar.BackDropView>
    <com.android.systemui.statusbar.ScrimView
        android:id="@+id/scrim_behind"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:importantForAccessibility="no"
        sysui:ignoreRightInset="true"
        />
    <!--解锁,在桌面时状态栏,通知+系统icon-->
    <FrameLayout
        android:id="@+id/status_bar_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <ViewStub android:id="@+id/fullscreen_user_switcher_stub"
              android:layout="@layout/car_fullscreen_user_switcher"
              android:layout_width="match_parent"
              android:layout_height="match_parent"/>
    <!--包含锁屏布局和下拉状态栏布局-->
    <include layout="@layout/status_bar_expanded"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="invisible" />
    <!--下拉全部状态栏亮度布局-->
    <include layout="@layout/brightness_mirror" />
    <com.android.systemui.statusbar.ScrimView
        android:id="@+id/scrim_in_front"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:importantForAccessibility="no"
        sysui:ignoreRightInset="true"
        />
</com.android.systemui.statusbar.phone.StatusBarWindowView>

视图

下面具体看看视图,有图有真相,更加直观。

桌面

1、CollapsedStatusBarFragment,status_bar.xml,PhoneStatusBarView,折叠状态栏,包含左边时间通知和右边系统 icon 2、NavigationBarFragment,navigation_bar.xml,底部导航栏

下拉状态栏

1、quick_status_bar_expanded_header.xml 1.1、quick_status_bar_header_system_icons.xml,时间和电量 1.2、quick_qs_status_icons.xml,日期和系统 icon 1.3、QuickQSPanel,quick_status_bar_expanded_header.xml,@+id/quick_qs_panel,快捷设置 2、NotificationStackScrollLayout,@+id/notification_stack_scroller,通知 3、status_bar_notification_footer.xml,通知管理和 clear all

下拉全部状态栏

1、quick_settings_brightness_dialog.xml,亮度设置 2、QSPanel,qs_panel.xml,@+id/quick_settings_panel,快捷设置 3、qs_footer_impl.xml,快捷设置排序和设置入口

锁屏

增加锁屏模式为 Swipe:

整个布局,NotificationPanelView,status_bar_expanded.xml 1、KeyguardStatusBarView,keyguard_status_bar.xml ,状态栏 2、KeyguardStatusView,keyguard_status_view.xml ,时间和日期 3、NotificationStackScrollLayout,@+id/notification_stack_scroller,通知 4、KeyguardBottomAreaView,keyguard_bottom_area.xml,底部解锁

结语

好了,这篇结束了,主要学习 StatusBar 相关布局在哪里写了,先有个直观认识。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android 8.0 自适应图标

    吴小龙同學
  • Android 9.0 SystemUI NavigationBar

    导航栏有返回(back),桌面(home),最近任务(recent),本篇主要学习这三个是如何加载的,点击事件在哪里写的?基于 AOSP 9.0 分析。

    吴小龙同學
  • Android 9.0 SystemUI Notification

    本文主要分享 SystemUI Notification 具体如何呈现的?基于 AOSP 9.0 分析。

    吴小龙同學
  • PopUpWindow的使用

    PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的。

    提莫队长
  • NestedScrollView 嵌套 ListView 实现滑动折叠效果

    用户1127566
  • Android实现横向滑动卡片效果

    最近项目上需要实现这样效果的一个页面,本来想找个现成的两下搞定,但是问了半天度娘也没招,索性自己琢磨琢磨(这里边也少不了同事的帮助),先把最终的效果图贴上:

    砸漏
  • Android编程双重单选对话框布局实现与事件监听方法示例

    本文实例讲述了Android编程双重单选对话框布局实现与事件监听方法。分享给大家供大家参考,具体如下:

    砸漏
  • 学习使用Material Design控件(四)Android实现标题栏自动缩放、放大效果

    CoordinatorLayout 组织它的子views之间协作的一个Layout,它可以给子View切换提供动画效果。 AppBarLayout 可以让...

    砸漏
  • Android Studio 3.5格式化布局代码时错位、错乱bug的解决

    设置 code style XML 右上角 Set from然后选择Predefined Style… Android即可

    砸漏
  • Android实现侧滑菜单DrawerLayout

    本文实例为大家分享了Android实现侧滑菜单的具体代码,供大家参考,具体内容如下

    砸漏

扫码关注云+社区

领取腾讯云代金券

,,