Systembars 是 systemUI 主要视图,接下来看看它是如何呈现?基于 AOSP 9.0 分析。
Systembars#startSystembars 启动中 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#makeStatusbarVIEwmakeStatusbarVIEw 是关键方法,创建 StatusbarVIEw,makeStatusbarVIEw 内容很多,本篇先看布局部分:
protected voID makeStatusbarVIEw() {
final Context context = mContext;
updatedisplaySize(); // populates mdisplayMetrics
updateResources();
updatetheme();
//对应布局文件:super_status_bar.xml
inflateStatusbarWindow(context);
//省略其他代码
}
Statusbar#inflateStatusbarWindowprotected 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 相关布局在哪里写了,先有个直观认识。
总结以上是内存溢出为你收集整理的Android 9.0 SystemUI 主要视图 SystemBars全部内容,希望文章能够帮你解决Android 9.0 SystemUI 主要视图 SystemBars所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)