Android P SystemUI之StatusBar UI布局status_bar.xml解析

相关源码:
\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\CollapsedStatusBarFragment.java

在文章《Android P SystemUI之super_status_bar.xml解析》讲到,StatusBar的UI主要是在super_status_bar.xml中加载的,其中状态栏UI部分主要容器status_bar_container中。

super_status_bar.xml的状态栏UI部分:

 <FrameLayout
     android:id="@+id/status_bar_container"
     android:layout_width="match_parent"
     android:layout_height="wrap_content" />

在StatusBar.java中初始化状态栏的UI:

// ================================================================================
// Constructing the view
// ================================================================================
protected void makeStatusBarView() {
	//省略一部分代码
	//...
       FragmentHostManager.get(mStatusBarWindow)
               .addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> {
                   CollapsedStatusBarFragment statusBarFragment =
                           (CollapsedStatusBarFragment) fragment;
                   statusBarFragment.initNotificationIconArea(mNotificationIconAreaController);
                   PhoneStatusBarView oldStatusBarView = mStatusBarView;
                   mStatusBarView = (PhoneStatusBarView) fragment.getView();
                   mStatusBarView.setBar(this);
                   mStatusBarView.setPanel(mNotificationPanel);
                   mStatusBarView.setScrimController(mScrimController);
                   mStatusBarView.setBouncerShowing(mBouncerShowing);
                   if (oldStatusBarView != null) {
                       float fraction = oldStatusBarView.getExpansionFraction();
                       boolean expanded = oldStatusBarView.isExpanded();
                       mStatusBarView.panelExpansionChanged(fraction, expanded);
                   }
                   if (mHeadsUpAppearanceController != null) {
                       // This view is being recreated, let's destroy the old one
                       mHeadsUpAppearanceController.destroy();
                   }
                   mHeadsUpAppearanceController = new HeadsUpAppearanceController(
                           mNotificationIconAreaController, mHeadsUpManager, mStatusBarWindow);
                   mStatusBarWindow.setStatusBarView(mStatusBarView);
                   setAreThereNotifications();
                   checkBarModes();
               }).getFragmentManager()
               .beginTransaction()
               .replace(R.id.status_bar_container, new CollapsedStatusBarFragment(),
                       CollapsedStatusBarFragment.TAG)
               .commit();
	//省略一部分代码
	//...
}

关键点:replace(R.id.status_bar_container, new CollapsedStatusBarFragment(),CollapsedStatusBarFragment.TAG)

mStatusBarWindow就是加载了layout view super_status_bar.xml的窗口对象。

这里使用CollapsedStatusBarFragment来填充status_bar_container的view。

CollapsedStatusBarFragment.java

CollapsedStatusBarFragment中加载的UI正是R.layout.status_bar

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.status_bar, container, false);
}

status_bar.xml

<!--    android:background="@drawable/status_bar_closed_default_background" -->
<com.android.systemui.statusbar.phone.PhoneStatusBarView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
    android:layout_width="match_parent"
    android:layout_height="@dimen/status_bar_height"
    android:id="@+id/status_bar"
    android:background="@drawable/system_bar_background"
    android:orientation="vertical"
    android:focusable="false"
    android:descendantFocusability="afterDescendants"
    android:accessibilityPaneTitle="@string/status_bar"
    >

    <ImageView
        android:id="@+id/notification_lights_out"
        android:layout_width="@dimen/status_bar_icon_size"
        android:layout_height="match_parent"
        android:paddingStart="@dimen/status_bar_padding_start"
        android:paddingBottom="2dip"
        android:src="@drawable/ic_sysbar_lights_out_dot_small"
        android:scaleType="center"
        android:visibility="gone"
        />

    <LinearLayout android:id="@+id/status_bar_contents"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingStart="@dimen/status_bar_padding_start"
        android:paddingEnd="@dimen/status_bar_padding_end"
        android:orientation="horizontal"
        >
        <ViewStub
            android:id="@+id/operator_name"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout="@layout/operator_name" />
        <FrameLayout
            android:layout_height="match_parent"
            android:layout_width="0dp"
            android:layout_weight="1">

            <include layout="@layout/heads_up_status_bar_layout" />

            <!-- The alpha of the left side is controlled by PhoneStatusBarTransitions, and the
             individual views are controlled by StatusBarManager disable flags DISABLE_CLOCK and
             DISABLE_NOTIFICATION_ICONS, respectively -->
            <LinearLayout
                android:id="@+id/status_bar_left_side"
                android:layout_height="match_parent"
                android:layout_width="match_parent"
                android:clipChildren="false"
            >
                <com.android.systemui.statusbar.policy.Clock
                    android:id="@+id/clock"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:textAppearance="@style/TextAppearance.StatusBar.Clock"
                    android:singleLine="true"
                    android:paddingStart="@dimen/status_bar_left_clock_starting_padding"
                    android:paddingEnd="@dimen/status_bar_left_clock_end_padding"
                    android:gravity="center_vertical|start"
                />

                <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
                    android:id="@+id/notification_icon_area"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:orientation="horizontal"
                    android:clipChildren="false"/>

            </LinearLayout>
        </FrameLayout>

        <!-- Space should cover the notch (if it exists) and let other views lay out around it -->
        <android.widget.Space
            android:id="@+id/cutout_space_view"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:gravity="center_horizontal|center_vertical"
        />

        <com.android.keyguard.AlphaOptimizedLinearLayout android:id="@+id/system_icon_area"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="horizontal"
            android:gravity="center_vertical|end"
            >

            <include layout="@layout/system_icons" />
        </com.android.keyguard.AlphaOptimizedLinearLayout>
    </LinearLayout>

    <ViewStub
        android:id="@+id/emergency_cryptkeeper_text"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout="@layout/emergency_cryptkeeper_text"
    />
</com.android.systemui.statusbar.phone.PhoneStatusBarView>

status_bar.xml的组成部分:
1、ImageView,id="@+id/notification_lights_out",低辨识度模式,flag是SYSTEM_UI_FLAG_LOW_PROFILE,进入进入低辨识度模式只显示这个imageView,为一个灰色小圆点,一般不可见。

status_bar_contents,状态栏的主Content,包括状态栏的全部图标,主要包括:
2、ViewStub,id="@+id/operator_name",包含了operator_name.xml,主要显示运营商名称
3、layout,heads_up_status_bar_layout,包含了一个heads_up_status_bar_layout.xml,主要显示heads_up信息,是一个提示信息,主要显示在状态栏下方,类似一个弹框的显示,用于提示信息。
4、 LinearLayout,status_bar_left_side,左边显示区域,时钟区域和notification_icon_area,一是显示时钟Clock,二是显示通知icon。
5、Space,id="@+id/cutout_space_view",空view,位于状态来中间位置。用于视图布局,不显示实际内容。
6、LinearLayout,id="@+id/system_icon_area",系统图标区域,主要包括蓝牙,wifi,4G信号等图标显示。这里加载了,system_icons.xml中去完成这些图标
7、ViewStub,:d="@+id/emergency_cryptkeeper_text",加载了emergency_cryptkeeper_text.xml,用于显示紧急电话文字。

需要注意的是,android 9.0系统中没有去使用signal_cluster_view加载信号变化图标显示。

signal_cluster_view是android 9.0之前的版本中使用到的。

你可能感兴趣的:(Android,P窗口机制)