Android 12 ソース コード分析 - アプリケーション レイヤ 4 (基本的なレイアウト設計と SystemUI の基本概念)

Android 12 ソース コード分析 - アプリケーション レイヤ 4 (基本的なレイアウト設計と SystemUI の基本概念)

最後の 2 つの記事では、SystemUI の起動プロセスと基本的なコンポーネントの依存関係を紹介しました。以下の記事ではこれらの依存関係の使用法が頻繁に登場し、その実装の詳細や原則については詳しく説明せずに簡単に説明するため、読者は基本的な依存関係を習得する必要があります。

次に、SystemUIの各UIパーツを画面に追加する方法と、各アイコンをドロップダウン状態で表示する実装を紹介します。

しかし、本当の話題に入る前に、SystemUI の各 UI の基本的なレイアウトと名前も理解する必要があります。これらの基本的なレイアウトと名前を理解することによってのみ、多くの類似した名前の中から特定のオブジェクトを区別することができます。

次に、SystemUI全体のレイアウトがどのような内容に大別され、どのような業務に対応しているのか、SystemUIの基本的なレイアウト設計について紹介します。

SystemUIのウィンドウ分割

記事「 Android 12 のソースコード分析 - アプリケーション層 2 (SystemUI の一般的な構成と起動プロセス) http://t.csdn.cn/chk6Y」の中で、SystemUI が WindowManager を通じて独自の UI を表示できることについて述べました。

実際、SystemUI は WindowManager を通じてメイン UI ビューを追加します。SystemUI では、以下の部品を別の Windows に配置し、WindowManager を通じて画面に追加します。

  1. ステータスバー—ステータスバー
  2. NoticeShade——通知ローラー シャッター (ドロップダウン ステータス バーとよく呼ばれるもの)
  3. NavigationBar—ナビゲーション バー

注: 上記の 3 つの共通ウィンドウに加えて、GlobalActionDialog (シャットダウンと再起動のポップアップ ボックスの表示を担当) や VolumeDialog (音量調整の表示) などの他のウィンドウもあります。話題の時間、続々登場

読者の中には「ロック画面はどうなるのでしょうか?」と疑問に思う人もいるかもしれません。別のウィンドウの下ではありませんか? 実際、ロック画面は別のウィンドウにあるのではなく、それ自体が NoticeShade (通知ローラー シャッター、つまりプルダウン ステータス バー) です。つまり、ロック画面のコンテンツとドロップダウン ステータス バーのコンテンツは同じウィンドウ内にあります。

ここで注意しなければならないことの 1 つは、対応する中国語の命名方法では、今後、対応するクラスの後に括弧を使用して中国語の名前をマークすることになります。このようなマークを付ける理由は、英語の名前には多くの類似点があるためですが、おそらくそうではありません。例: StatusBar はステータス バーと呼ばれていますが、Windows ごとに異なる StatusBar (ステータス バー) が存在します。たとえば、ロック画面状態には KeyguardViewStatusBar (ロック画面ステータス バー) があり、同様に、NotificationShade にも KeyguardViewStatusBar (ロック画面ステータス バー) があります。 (通知) ローリング シャッター (つまり、ドロップダウン ステータス バー) 内で、StatusBar (ステータス バー) が表示されるべき場所は、StatusBar とは呼ばれません。覚えやすいように、中国語名を括弧内に入れます。

理解しやすいように、ウィンドウは次のようにマークされています。
ここに画像の説明を挿入します

ここに画像の説明を挿入します

ここに画像の説明を挿入します
ここに画像の説明を挿入します

上記の直感的な感覚で、SystemUI のレイアウト ファイルを結合して、その UI レイアウトとそれに関連する概念を一般的に紹介し、これらの概念を使用して、複雑なソース コード内で対応する実装エンティティを見つけることができます。

SystemUI の命名規則とデザイン パターン

この記事のトピックは SystemUI のレイアウトの紹介ですが、「これらのレイアウトはいつ読み込まれるのですか?」という疑問がまだあるかもしれません。読み込みプロセスはどのようなものですか?

後続の記事では、これらのレイアウトの読み込みとさまざまなイベントの処理方法を紹介しますが、その前に、レイアウト間のデザイン パターンと命名規則を理解する必要があります。

SystemUI の各小さなモジュールは MVC や MVP などのデザイン パターンを採用しているため、その命名体系では、xxxView、xxxController、xxxPresenter で表されることがよくあります。たとえば、StatusBarWindowView(ステータスバーウィンドウビュー)とStatusBarWindowController(ステータスバーウィンドウコントローラ)はStatusBar(ステータスバー)を表し、StatusBarWindowに関連するモデルはStatusBar(ステータスバー)です。

もちろん、SystemUI には長い編集履歴があり、いくつかの大きな変更が加えられています。すべてのクラスがこれらのルールに従っているわけではありませんが、読者はソース コードを読むときにこれらの方針に沿って考えることができます。

この記事では、SystemUI レイアウトの紹介に焦点を当てており、これらのレイアウトの読み込み時間やプロセスについては考慮していませんが、小さなヒントを使用して、これらのレイアウトの読み込みプロセスを簡単に要約します。これらの簡単な読み込みプロセスを読むと、多くの類似した名前が表示されるため、上記の命名規則に従って対応するエンティティを対応付けることができます。

これらの UI の読み込みプロセスとユーザー操作については後続の記事で詳しく紹介するため、読者はこれらの読み込みプロセスを無視してかまいません。

最も複雑な NoticeShade (通知ローラー シャッター、ドロップダウン ステータス バー) から始めましょう。

SystemUI の NoticeShade (通知ローラー シャッター、つまりドロップダウン ステータス バー) ウィンドウの詳細なレイアウト

NoticeShade(通知ローラーシャッター、プルダウンステータスバー)ウィンドウ読み込み処理

上記の説明に従って、最初に簡単に説明しますが、このレイアウトのロードプロセスは次のとおりです。

  1. SytemUIService が開始されたら、SystemUIApplication の startServicesIfNeeded() を呼び出して、対応するサービスを開始します (「Android 12 ソースコード解析 - アプリケーション層 2 (SystemUI 全体構成と起動プロセス) http://t.csdn.cn/chk6Y )
  2. 開始されたサービスの中には、StatusBar と呼ばれるサービスがあり、これは最初のステップで start() メソッドと呼ばれます。
  3. start() メソッド内で、createAndAddWindows() メソッドが呼び出されます。
  4. createAndAddWindows() メソッドは makeStatusBarView() メソッドを呼び出します
  5. makeStatusBarView() メソッドは inflateStatusBarWindow() メソッドを呼び出します
  6. inflateStatusBarWindow() メソッドは、SuperStatusBarViewFactory の getNotificationShadeWindowView() メソッドを呼び出します。
  7. getNotificationShadeWindowView() メソッドは、super_notification_shade.xml である R.layout.super_notification_shade をロードして解析します。
  8. ステップ 7 が完了すると、ステップ 4 に戻り、NotificationShadeWindowController のattach() メソッドを呼び出して、対応する UI を画面に追加します。

注: 上記の呼び出しプロセスについては、次の記事で詳しく紹介されているため、読者は完全に無視してかまいません。

次に、super_notification_shade.xml を分析します。

NoticeShade (通知ローラー シャッター、ドロップダウン ステータス バー) ウィンドウの上面図

super_notification_shade.xml のソースファイルは以下のとおりです。

注: 読みづらさを軽減するために、いくつかのプロパティの定義と割り当て、およびいくつかの非常に単純なレイアウト ビューなど、非常に一般的なコードの一部を省略します。

<com.android.systemui.statusbar.phone.NotificationShadeWindowView>

    <com.android.systemui.statusbar.BackDropView>
        
    </com.android.systemui.statusbar.BackDropView>

    <com.android.systemui.scrim.ScrimView
        android:id="@+id/scrim_behind" />

    <com.android.systemui.scrim.ScrimView
        android:id="@+id/scrim_notifications"/>

    <com.android.systemui.statusbar.LightRevealScrim
            android:id="@+id/light_reveal_scrim" />

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

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

    <com.android.systemui.scrim.ScrimView
        android:id="@+id/scrim_in_front" />

    <!-- Keyguard messages -->
    <FrameLayout>
        <com.android.keyguard.KeyguardMessageArea
            android:id="@+id/keyguard_message_area"/>
    </FrameLayout>

    <com.android.systemui.biometrics.AuthRippleView/>
</com.android.systemui.statusbar.phone.NotificationShadeWindowView>

上記のコード構造は非常にシンプルなので、次のように紹介します。

  1. NoticeShadeWindowView: 通知シャッター ウィンドウ。プルダウン ステータス バー ウィンドウの最上部のビューです。

  2. BackDropView: カーテン ビュー。音楽の再生時など、下部にいくつかの背景が表示されます。音楽のアルバム画像が表示されます。

  3. ScrimView: 全部で 3 つあり、主にマスキングを担当します。たとえば、ロック画面状態では、ロック画面のインターフェイス全体が少し暗くなりますが、これはマスクの透明度を設定することで実現されます。

  4. LightRevealScrim: これもマスク関連のビューです。一部のグラデーション アニメーションの処理を担当します。たとえば、設定で画面表示をオンにすると、電源ボタンをクリックすると、対応するアニメーションが表示されます。以下に示されています。
    ここに画像の説明を挿入します

  5. status_bar_expanded.xml: 展開されたステータスのレイアウト。ステータス バーがプルダウンされた後に表示されるコンテンツを詳細に示します。

  6. Brightness_mirror_container.xml: status_bar_expandedにも明るさ調整バーがあるので、これは明るさ調整バーに対応したミラービューですが、これは明るさを調整する際にstatus_bar_expandedの内容を非表示にするためです。

  7. KeyguardMessageArea: ロック画面情報表示エリア PIN を間違えて入力すると、ここに間違った PIN が表示されます。

参考画像を直接提供できる 7 番目のポイントを除いて、その他は特に優れた参考画像を提供できないため、記事の最後に推奨されているレイアウト表示ツールを使用して表示できます。

上記にはインクルード XML ファイルが 2 つありますが、それぞれのファイルを導入すると多くのスペースを消費すると同時に、詳細が不適切になるため、いくつかの簡単なレイアウト ファイルについて簡単に説明します。上記の Brightness_mirror_container.xml ファイル。これらのスキップされたファイルについては、特定のサブトピックで詳しく紹介します (たとえば、上記の Brightness_mirror_container.xml については、音量の調整に関する記事で詳しく紹介します)。

したがって、次に status_bar_expanded.xml ファイルを紹介します。

status_bar_expanded.xml ファイルの分析

status_bar_expanded.xml ファイルの元のテキストは次のとおりです。

注: 一部の属性の定義と割り当てはここでも省略されます。

<com.android.systemui.statusbar.phone.NotificationPanelView
    android:id="@+id/notification_panel">
    <FrameLayout
        android:id="@+id/big_clock_container" />

    <ViewStub
        android:id="@+id/keyguard_qs_user_switch_stub"/>

    <include
        layout="@layout/keyguard_bottom_area"
        android:visibility="gone" />

    <ViewStub
        android:id="@+id/keyguard_user_switcher_stub" />

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

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

    <com.android.keyguard.LockIconView
        android:id="@+id/lock_icon_view">
    </com.android.keyguard.LockIconView>

    <com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer
        android:id="@+id/notification_container_parent">

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

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

        <FrameLayout android:id="@+id/qs_frame"/>

        <androidx.constraintlayout.widget.Guideline 
            android:id="@+id/qs_edge_guideline"/>

        <com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
            android:id="@+id/notification_stack_scroller"/>

        <include layout="@layout/ambient_indication"
            android:id="@+id/ambient_indication_container" />

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

        <include
            layout="@layout/keyguard_status_bar"
            android:visibility="invisible" />

        <Button
            android:id="@+id/report_rejected_touch"/>
        <com.android.systemui.statusbar.phone.TapAgainView
            android:id="@+id/shade_falsing_tap_again"/>
    </com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer>

    <FrameLayout
        android:id="@+id/preview_container">
    </FrameLayout>
</com.android.systemui.statusbar.phone.NotificationPanelView>

上記のファイルの概要は次のとおりです。

  1. NoticePanelView: 通知バー全体とクイック設定アイコンの最上位ディレクトリ
  2. ID big_clock_container の FrameLayout: より大きな時計ビューを表示します
  3. 2 つの ViewStub: これは複数のユーザーのビューの切り替えに関連しています。マルチユーザーをクリックすると、切り替えられたビューが 2 つの ViewStub のいずれかに表示されます。
  4. keyguard_bottom_area.xml: 充電中などのロック画面の下部エリアを表示します。
  5. status_bar_expanded_plugin_frame.xml: SystemUI プラグインに関連しています。詳細は後ほど詳しく紹介しますので、ここでは無視していただいてかまいません。
  6. dock_info_bottom_area_overlay.xml:空的
  7. LockIconView: ロック画面インターフェイスの下のロック アイコン
  8. NoticesQuickSettingsContainer: 通知とクイック設定が表示される、通知とクイック設定のコンテナー
  • keyguard_status_view.xml: 日付の表示など、ロック画面に関連するステータス ビューを表示します。
  • dock_info_overlay.xml: 空
  • ID qs_frame の FrameLayout: クイック設定用の親コンテナー
  • ガイドライン: レイアウトを調整するために使用するビュー
  • NoticeStackScrollLayout: 通知を表示するために使用される親コンテナー
  • ambient_indication.xml: 空
  • photo_preview_overlay.xml: 空
  • keyguard_status_bar.xml: ロック画面状態のステータス バー
  • ボタン: デバッグに使用します。心配しないでください
  • TapAgainView: もう一度押したときのビューを表示します。現在は使用されていません。
  1. ID がpreview_containerのFrameLayout:プレビュー画像表示ビュー(カメラ画像をスライドさせるなど)、カメラ画像が最初に表示されます

注: 上記の XML ファイルの一部の説明は空です。コンテンツの一部は使用されなくなりましたが、コンテンツの一部は後続の記事に表示されます。

上記の XML ファイルでは、注意深い読者はロック画面が NoticeShade ウィンドウにもあることに気づいたかもしれません。上記の内容を視覚的に確認するために、以下に示すように図を使用して説明します。
ここに画像の説明を挿入します

上記のソースコードには、

  1. keyguard_bottom_area.xml
  2. status_bar_expanded_plugin_frame.xml
  3. dock_info_bottom_area_overlay.xml
  4. keyguard_status_view.xml
  5. ドック情報_オーバーレイ.xml
  6. ambient_indication.xml
  7. photo_preview_overlay.xml
  8. keyguard_status_bar.xml
    は上記のファイル内にあります。status_bar_expanded_plugin_frame.xml、dock_info_bottom_area_overlay.xml、dock_info_overlay.xml、ambient_indication.xml、photo_preview_overlay.xml の一部は使用されません。それらの一部は後続のサブトピックで紹介されます。読むのに影響はありません。理解してください。

残りの 3 つのファイル keyguard_bottom_area.xml、keyguard_status_view.xml、keyguard_status_bar.xml はシンプルでわかりやすく、UI に対応しやすいため、ここでは紹介しません。これは、この記事を読んで理解するのには影響しません。ただし、心配しないでください。後続の記事で、これら 3 つのファイルについても紹介し、それらの相互作用と初期化プロセスを確認します。簡潔にするために、ここでは省略します。

ロック画面に関連する UI とコード間の接続を確立できましたが、ドロップダウン設定の UI とコード間の接続をまだ確立できません。次に、この部分を扱います。

QuickSettings のレイアウト分析

上記のコードでは、Qs_frameというIDを持つFrameLayoutを使用してクイック設定を表示することが導入されていますが、次に、それらがどのように配置されているかを見てみましょう。

注:NotificationStackScrollLayout のレイアウトの詳細については、後で詳しく説明します。

QuickSettings の読み込みプロセス

上でわかったように、ID qs_frame の FrameLayout は、レイアウトのロードに include を使用しません。これは、最初にロード プロセスを簡単に説明してから、そのレイアウト構造を確認する必要があるためです。

  1. SytemUIService が開始されたら、SystemUIApplication の startServicesIfNeeded() を呼び出して、対応するサービスを開始します (「Android 12 ソースコード解析 - アプリケーション層 2 (SystemUI 全体構成と起動プロセス) http://t.csdn.cn/chk6Y )
  2. 開始されたサービスの中には、StatusBar と呼ばれるサービスがあり、これは最初のステップで start() メソッドと呼ばれます。
  3. start() メソッド内で、createAndAddWindows() メソッドが呼び出されます。
  4. createAndAddWindows() メソッドは makeStatusBarView() メソッドを呼び出します
  5. makeStatusBarView() メソッドは、ID qs_frame の FrameLayout を検索し、それに QSFragment を追加します。
  6. QSFragment は qs_panel.xml ファイルをロードします。このファイルはクイック セットアップ レイアウト ファイルです。

qs_panel.xml ファイルの分析

qs_panel.xml の元のテキストは次のとおりです。

<com.android.systemui.qs.QSContainerImpl
    android:id="@+id/quick_settings_container" >

    <com.android.systemui.qs.NonInterceptingScrollView
        android:id="@+id/expanded_qs_scroll_view">
        <com.android.systemui.qs.QSPanel
            android:id="@+id/quick_settings_panel">
            <include layout="@layout/qs_footer_impl" />
        </com.android.systemui.qs.QSPanel>
    </com.android.systemui.qs.NonInterceptingScrollView>

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

    <include android:id="@+id/qs_detail" layout="@layout/qs_detail" />

    <include android:id="@+id/qs_customize" layout="@layout/qs_customize_panel"
        android:visibility="gone" />

</com.android.systemui.qs.QSContainerImpl>
  1. QSContainerImpl: クイック設定用の親コンテナ
  2. NonInterceptingScrollView: クイック設定の各アイコンの ScrollView
  • QSPanel: QSPanel には内部の特定の詳細が表示されます
  • qs_footer_impl.xml: クイック設定のアイコンの編集など、クイック設定の下部にある表示ビュー。以下の図の対応関係を参照してください。
  1. Quick_status_bar_expanded_header.xml: クイック設定のヘッダー領域。以下の画像設定を参照してください。
  2. qs_detail.xml: クイックセットアップの詳細
  3. qs_customize.xml: クイック設定インターフェイスの編集

連絡を容易にするために、下の図を参照してください

ここに画像の説明を挿入します

ここに画像の説明を挿入します
ここに画像の説明を挿入します

上の図では、QSPanel 内にクイック設定用のさまざまな小さなアイコンがあることがわかります。これらのアイコンは QSTile と呼ばれます。

それらのロードプロセスについては、QSPanel のソースコード解析で詳しく説明します。この記事は、特定の UI の詳細ではなく、SystemUI のレイアウト設計を紹介することを目的としています。

qs_frame のレイアウトを導入した後、ウィンドウの下の最後のレイアウト、NotificationStackScrollLayout も確認する必要があります。

NoticeStackScrollLayoutのレイアウト分析

NoticeStackScrollLayout は、他のレイアウト ファイルを参照するためにインクルードを使用せず、内部的に他の方法でレイアウトを追加するクラスです。

NoticeStackScrollLayout 通知レイアウトの読み込みプロセス

  1. システムから通知が到着したら、NotificationListener の onNotificationPosted() メソッドを呼び出します。
  2. onNotificationPosted メソッドでは、NotificationEntryManager の mNotifiListener の onNotificationPosted() メソッドに通知されます。
  3. このメソッドでは、addNotification() メソッドが呼び出され、次に addNotification() で addNotificationInternal() メソッドが呼び出されます。
  4. addNotificationInternal() メソッドでは、NotificationRowBinderImpl の inflateViews() メソッドが呼び出されます。
  5. このメソッドでは、RowInFlaterTask の inflate() メソッドが呼び出されます。
  6. inflate() メソッドでは、status_bar_notification_row.xml ファイルがロードされます。

次に、このファイルの内容を見てみましょう

status_bar_notification_row.xml ファイルの分析

status_bar_notification_row.xml ファイルの元のテキストは次のとおりです。

<com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
    android:id="@+id/expandableNotificationRow">
 <!--只有一个ExpandableNotificationRow-->
</com.android.systemui.statusbar.notification.row.ExpandableNotificationRow>

コンテンツは 1 つだけです。もちろん、ここでその内部コンテンツに関連付ける必要はありません。ExpandableNotificationRow は、特定のコンテンツを表示する方法がすでに含まれているため、観察する最小のレイアウトです。ここで理解する必要があるのは、一般的な内容だけです。レイアウトを作成し、関連する概念を理解する

  1. ExpandableNotificationRow: 展開可能な通知

ここに画像の説明を挿入します

注: 通知の並べ替えや優先順位などについては、次の記事で 1 つずつ紹介しますが、ここでは全体のレイアウトと基本的な概念を理解するだけで済みます。

これで、NotificationShade ウィンドウのレイアウトの紹介はほぼ完了しました。ここで、各 UI のエンティティについて理解しました。もちろん、一部の UI エンティティは省略されています。省略された部分については、サブで詳しく紹介します-次の記事のトピックス

次に、残りの 2 つのウィンドウ、StatusBar と NavigationBar を見ていきます。

ステータスバーウィンドウの詳細なレイアウト

ステータスバーウィンドウの読み込み処理

まず、そのロードプロセスを簡単に紹介しましょう。

  1. SytemUIService が開始されたら、SystemUIApplication の startServicesIfNeeded() を呼び出して、対応するサービスを開始します (「Android 12 ソースコード解析 - アプリケーション層 2 (SystemUI 全体構成と起動プロセス) http://t.csdn.cn/chk6Y )
  2. 開始されたサービスの中には、StatusBar と呼ばれるサービスがあり、これは最初のステップで start() メソッドと呼ばれます。
  3. start() メソッド内で、createAndAddWindows() メソッドが呼び出されます。
  4. createAndAddWindows() メソッドは makeStatusBarView() メソッドを呼び出します
  5. makeStatusBarView() メソッドでは、inflateStatusBarWindow() メソッドが呼び出されます。
  6. inflateStatusBarWindow() メソッドでは、StatusBarComponent の getStatusBarWindowController() メソッドを通じて StatusBarWindowController を取得します。
  7. StatusBarWindowController のコンストラクターで、SuperStatusBarViewFactory の getStatusBarWindow() メソッドが呼び出されます。
  8. SuperStatusBarViewFactory の getStatusBarWindow() メソッドは、super_status_bar.xml ファイルをロードします。
  9. 手順4のcreateAndAddWindows()メソッドでは、StatusBarWindowControllerのattach()メソッドを呼び出して画面に追加します。

次にStatusBar(ステータスバー)のレイアウトファイルを見てみましょう

StatusBar(ステータスバー)Windowの上面図

super_status_bar.xml のソースファイルは以下のとおりです。

<com.android.systemui.statusbar.phone.StatusBarWindowView>
    <FrameLayout
        android:id="@+id/status_bar_launch_animation_container"/>
    <FrameLayout
        android:id="@+id/status_bar_container" />
</com.android.systemui.statusbar.phone.StatusBarWindowView>

とてもとても爽やかです!

  1. StatusBarWindow: ステータス バーの最上位ビューを表します。
  2. ID status_bar_launch_animation_container の FrameLayout: アニメーションを表示します。例: StatusBar (ステータス バー) からアクティビティを開始するときのアニメーション表示領域
  3. ID status_bar_contianer の FrameLayout: これは、実際のステータス バー コンテンツのメイン領域です

次に詳細を見ていきます

StatusBar(ステータスバー)のレイアウト解析

上記の ID は status_bar_contianer であり、FrameLayout です。レイアウトをどのようにロードするかを見てみましょう。まず、レイアウトの読み込みプロセスを簡単に紹介します。

StatusBar(ステータスバー)レイアウト読み込み処理

  1. SytemUIService が開始されたら、SystemUIApplication の startServicesIfNeeded() を呼び出して、対応するサービスを開始します (「Android 12 ソースコード解析 - アプリケーション層 2 (SystemUI 全体構成と起動プロセス) http://t.csdn.cn/chk6Y )
  2. 開始されたサービスの中には、StatusBar と呼ばれるサービスがあり、これは最初のステップで start() メソッドと呼ばれます。
  3. start() メソッド内で、createAndAddWindows() メソッドが呼び出されます。
  4. createAndAddWindows() メソッドは makeStatusBarView() メソッドを呼び出します
  5. makeStatusBarView() メソッドは、CollapsedStatusBarFragment を ID status_bar_container で FrameLayout に配置します。
  6. CollapsedStatusBarFragment は、onCreateView 中に status_bar.xml ファイルをロードして初期化します。

status_bar.xml ファイルの分析

status_bar.xml ファイルの元のテキストは次のとおりです。

<com.android.systemui.statusbar.phone.PhoneStatusBarView
    android:id="@+id/status_bar">

    <ImageView
        android:id="@+id/notification_lights_out"/>

    <LinearLayout android:id="@+id/status_bar_contents">
        <FrameLayout>
            <include layout="@layout/heads_up_status_bar_layout" />

            <LinearLayout
                android:id="@+id/status_bar_left_side">
                <ViewStub
                    android:id="@+id/operator_name"/>

                <com.android.systemui.statusbar.policy.Clock
                    android:id="@+id/clock"/>

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

                <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
                    android:id="@+id/notification_icon_area"/>

            </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" />

        <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
            android:id="@+id/centered_icon_area"/>

        <com.android.keyguard.AlphaOptimizedLinearLayout android:id="@+id/system_icon_area">

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

    <ViewStub
        android:id="@+id/emergency_cryptkeeper_text"/>

</com.android.systemui.statusbar.phone.PhoneStatusBarView>
  1. PhoneStatusBarView: ステータス バー コンテンツの親コンテナ
  2. このビューは、SYSTEM_UI_FLAG_LOW_PROFILE モードでステータス バーの表示が要求されたときに、小さなドットを表示します。
  3. ID status_bar_content の LinearLayout: ステータス バーのコンテンツを表示します
  • heads_up_status_bar_layout.xml: ステータスバーのプロンプト情報の一部
  • ID status_bar_left_side の LinearLayout: ステータス バーの左側の表示領域
  • スペース: 中央の空いたスペースを埋めます。
  • AlphaOptimizedFrameLayout: 中央のアイコン表示領域
  • AlphaOptimizedLinearLayout: システム アイコンの表示領域 (バッテリーの割合など)
  1. ID がEmergency_cryptkeeper_textのViewStub: 緊急通話のみ発信可能

上記のレイアウトファイルを見てわかるように、StatusBar(ステータスバー)は大きく左・中・右の3つのエリアに分かれており、大まかなレイアウト、つまりViewの内容を理解するだけで済みます。ソースコードを読むときのソースコードのどの部分を参照しているのかが使用可能です。以降の記事では、これらのレイアウトの内容と実装の詳細について詳しく紹介します。

ここまでで、SystemUI の 2 つの最も重要なウィンドウのレイアウトを理解しました。最後に残ったWindowはNavigationBarですが、シンプルなレイアウトなのでAndroidのナビゲーションジェスチャを解析する際に紹介します。

次の一連の記事について繰り返し言及するため、この記事では次の概念だけを習得する必要があります。

  1. SystemUI ウィンドウの分割
  2. SystemUI の各 UI の名前は、NotificationShadeView、QS などです。
  3. 対応するビューのコントローラーの名前と、それがおそらくどのように見えるかを知ってください。たとえば、NotificationShadeWindowView のコントローラーは、NotificationShadeWindowViewController と呼ばれる必要があり、その逆も同様です。

最近体調が悪く、学校も始まったので、勉強も忙しく、急いで書いているので、間違いがあるのは仕方のないことです。見るのを忘れていた読者の方は、思い出させてください。ありがとうございます。あらかじめ。

補足:レイアウト閲覧ツール

読者は次のツールを使用して、対応するレイアウトを表示できます。

  1. 古いバージョンの DDMS、階層ビュー
  2. YALI for Android Studio (プラグイン マーケットを通じてインストール)
  3. Android Studio の Legacy Layout Inspector (プラグイン マーケットを通じてインストール)

Android Studio に付属の Layout Inspector については、使用することは推奨されません。

おすすめ

転載: blog.csdn.net/xiaowanbiao123/article/details/132654468