上次讲到super_status_bar.xml被加载进来,下面是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" android:layoutDirection="ltr"> <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" /> <com.android.systemui.statusbar.AlphaOptimizedView android:id="@+id/heads_up_scrim" android:layout_width="match_parent" android:layout_height="@dimen/heads_up_scrim_height" android:background="@drawable/heads_up_scrim" sysui:ignoreRightInset="true" android:importantForAccessibility="no"/> <include layout="@layout/status_bar" android:layout_width="match_parent" android:layout_height="@dimen/status_bar_height" /> <include layout="@layout/brightness_mirror" /> <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="gone" /> <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>
通过上述view布局及makeStatusBarView相关代码,可以发现mStatusBarWindow(StatusBarWindowView)中包含以下4个部分:
- ScrimView
- PhoneStatusBarView layout-> status_bar
- NotificationPanelView -> status_bar_expanded
- ScrimView
其实这里还漏掉了一个重要的view—-keyguard_bouncer,它不是直接在layout布局里加入的,只有用户设置锁屏保护后才可见。
PhoneStatusBarView
PhoneStatusBarView即为手机最上方的状态栏,主要用于显示系统状态,通知等,主要包括 notification icons 和 status bar icons
NotificationPanelView的内容比较多,主要包括下拉状态栏、锁屏界面的时间和锁屏界面的底部区域的一些显示
如图:
这个SystemUI是本人亲自做的,晒一晒,哈哈!
KeyguardBouncer
KeyguardBouncer是锁屏解锁界面,根据用户设置的解锁方式不同,展示不同的解锁模式。
先看看KeyguardBouncer长什么样子:
锁屏界面:
上滑锁屏后:
需要注意的是KeyguardBouncer有多种形式,上图中展示的是图案解锁,若为密码解锁KeyguardBouncer将会以数字键盘的形式展示。但无论哪种形式,都是在KeyguardBouncer中加载进来的。
public class KeyguardBouncer {
private ViewGroup mRoot;
private ViewGroup mContainer;
private KeyguardHostView mKeyguardView;
private void inflateView() {
mRoot = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.keyguard_bouncer, null);
mKeyguardView =(KeyguardHostView)mRoot.findViewById(R.id.keyguard_host_view);
mKeyguardView.setLockPatternUtils(mLockPatternUtils);
mKeyguardView.setViewMediatorCallback(mCallback);
mContainer.addView(mRoot,mContainer.getChildCount());
}
KeyguardBouncer的View树如下:
小结:
通过分析SystemBars的呈现流程介绍了PhoneStatusBarView,NotificationPanelView,keyguardbouncer三个常见SystemUI的界面布局及相关功能。当然,SystemUI的布局还是很复杂的,上述只对主要的视图从大的方向上做了分析。SystemUI也不只以上几个布局,包括最近应用视图,底部导航栏(Navigation Bar),全局音量管理Dialog等,本文暂时未介绍到。
总结:
本文分为两部分,分别介绍了SystemUI主体框架启动流程及SystemUI关键视图的界面布局呈现过程。通过以上介绍,在以后遇到SystemUI相关问题时,可以先定位出问题View属于哪个大的分类,然后结合图例给出的id缩小定位范围。