从相关的布局文件xml中可以找到状态栏主要的Layout:
将ScrimView的背景绘制成红色,可以发现ScrimView的布局范围,如下图:
即在 ScrimView 中 执行 canvas.drawColor(Color.RED, mode);
public class ScrimView extends View
{
@Override
protected void onDraw(Canvas canvas) {
if (mDrawAsSrc || (!mIsEmpty && mViewAlpha > 0f)) {
PorterDuff.Mode mode = mDrawAsSrc ? PorterDuff.Mode.SRC : PorterDuff.Mode.SRC_OVER;
int color = mScrimColor;
color = Color.argb((int) (Color.alpha(color) * mViewAlpha), Color.red(color),
Color.green(color), Color.blue(color));
canvas.drawColor(Color.RED, mode);
}
}
}
如果把PanelHolder也设置成红色背景,也会出现上面的情况,而且状态栏不能看到图标&时间,说明PanelHolder在图标、时间之上,而且宽度占满屏幕
通过工具找到通知栏下拉后的布局
根布局为 super_status_bar.xml
从这段代码看到,include的layout文件为 status_bar_expanded.xml
status_bar_expanded.xml的文件根布局为
com.android.systemui.statusbar.phone.NotificationPanelView
从dump view hierarchy工具获取到的id为 notification_stack_scroller, 这个id在status_bar_expanded.xml 中,
NotificationPanelView是PanelView的子类
public class NotificationPanelView extends PanelView
PanelView继承了FrameLayout
public abstract class PanelView extends FrameLayout
status_bar_expanded.xml下有几个布局、控件
1 carrier_label: 显示运营商标签
2 keyguard_status_view.xml:锁屏UI的时钟信息,将keyguard_status_area 布局包含在这里面
3 emergency_calls_only: 紧急电话TextView
4 notification_container_parent: NotificationsQuickSettingsContainer 下拉通知栏布局容器
5 scroll_view:ObservableScrollView, 滚动视图,包括快速设置按钮布局、通知信息分割线 reserve_notification_space等
6 notification_stack_scroller: NotificationStackScrollLayout 可滚动的通知栏布局
如果把notification_stack_scroller的width设置为match_parent,
会有下面的效果。通知列表与屏幕等宽,说明NotificationStackScrollLayout是通知列表的容器布局
如果把ObservableScrollView, scroll_view 的width设置为match_parent,
会有下面效果。说明scroll_view是包含快捷按键的Layout布局
布局文件如下:
如果将android:layout_width="@dimen/notification_panel_width"改成match_parent,头部布局会铺满屏幕
brightness_mirror是通过通知栏调节亮度时,弹出亮度框的布局
super_status_bar.xml
修改其width可以修改layout的宽度