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之前的版本中使用到的。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
如果你想要在系统UI中将状态栏设置为透明,可以使用以下方法: 1. 在 `res/values/styles.xml` 中添加以下代码: ``` <style name="TransparentSystemBars" parent="@android:style/Theme.DeviceDefault.NoActionBar"> <item name="android:windowTranslucentStatus">true</item> <item name="android:statusBarColor">@android:color/transparent</item> </style> ``` 这些代码将定义一个新的主题,其中包含窗口的状态栏透明和状态栏颜色透明。 2. 在 `AndroidManifest.xml` 文件中将应用程序的主题设置为新定义的主题: ``` <application ... android:theme="@style/TransparentSystemBars"> ... </application> ``` 这些代码将应用程序的主题设置为新定义的主题,其中包含透明状态栏状态栏颜色。 3. 在 `onCreate` 方法中设置状态栏透明: ``` if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.setStatusBarColor(Color.TRANSPARENT); } ``` 这些代码将启用透明状态栏,并将状态栏的背景颜色设置为透明。 请注意,这些代码只在 Android 5.0(API级别21)及以上版本上起作用。如果你的应用程序运行在旧的 Android 版本上,则无法使用这些代码。 希望这些代码能够帮助你在系统UI中实现透明状态栏。如果问题依然存在,请提供更多的细节和错误信息,以便我更好地帮助你。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值