引言
今天我们主要讲的是SystemUI状态栏里面常见的一排icons——status icons,该icons主要用于显示Bluetooth、Location、Headset等等系统状态的icon,表示当前手机蓝牙、定位、耳机等的功能开启了,以达到提示用户的目的。
正文
本文主要从两个方面讲述下status icon功能,主要分为初始化流程和状态显示流程
话不多说,我们开始吧。
初始化流程
首先我们看下状态栏的布局文件 status_bar.xml
<com.android.keyguard.AlphaOptimizedLinearLayout android:id="@+id/system_icon_area"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"
>
<include layout="@layout/system_icons" />
<com.android.systemui.statusbar.policy.Clock
android:id="@+id/clock"
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:singleLine="true"
android:paddingStart="@dimen/status_bar_clock_starting_padding"
android:paddingEnd="@dimen/status_bar_clock_end_padding"
android:gravity="center_vertical|start"
/>
</com.android.keyguard.AlphaOptimizedLinearLayout>
其中我们今天讲的status_icons就藏身于 system_icons.xml 之中
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/system_icons"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical">
<com.android.keyguard.AlphaOptimizedLinearLayout android:id="@+id/statusIcons"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal"/>
<include layout="@layout/signal_cluster_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/signal_cluster_margin_start"/>
<com.android.systemui.BatteryMeterView android:id="@+id/battery"
android:layout_height="match_parent"
android:layout_width="wrap_content"
/>
</LinearLayout>
android:id="@+id/statusIcons"出现了,人如其名,它其实是一个自定义的LinearLayout——AlphaOptimizedLinearLayout,这个Viewt也是非常简单的,只是实现了如下方法
@Override
public boolean hasOverlappingRendering() {
return false;
}
该方法用来标记当前view是否存在过度绘制,存在返回ture,不存在返回false,而api里面默认返回为true,诚然我们status icon是个好同学,不存在过度绘制。
接下来我们看下SystemUI是怎么加载这个AlphaOptimizedLinearLayout
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mStatusBar = (PhoneStatusBarView) view;
if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_PANEL_STATE)) {
mStatusBar.go(savedInstanceState.getInt(EXTRA_PANEL_STATE));
}
mDarkIconManager = new DarkIconManager(view.findViewById(R.id.statusIcons));
Dependency.get(StatusBarI