【Android系统源码修改】如何分析SystemUI Layout 的组成

StatusBar

从相关的布局文件xml中可以找到状态栏主要的Layout:

  • 1 StatusBarWindowView是状态栏根布局
  • 2 BackDropView
  • 3 ScrimView是状态栏下拉后,背景,半透明灰色
  • 4 status_bar状态栏的布局
  • 5 PanelHolder,下拉通知栏布局

    
        
        
    
    
    
    
        
            
        
    
    
        
    
    



ScrimView

将ScrimView的背景绘制成红色,可以发现ScrimView的布局范围,如下图:
【Android系统源码修改】如何分析SystemUI Layout 的组成_第1张图片
即在 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也设置成红色背景,也会出现上面的情况,而且状态栏不能看到图标&时间,说明PanelHolder在图标、时间之上,而且宽度占满屏幕
【Android系统源码修改】如何分析SystemUI Layout 的组成_第2张图片
在这里插入图片描述


下拉通知栏布局

通过工具找到通知栏下拉后的布局
【Android系统源码修改】如何分析SystemUI Layout 的组成_第3张图片
根布局为 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是通知列表的容器布局
【Android系统源码修改】如何分析SystemUI Layout 的组成_第4张图片
如果把ObservableScrollView, scroll_view 的width设置为match_parent,



会有下面效果。说明scroll_view是包含快捷按键的Layout布局
【Android系统源码修改】如何分析SystemUI Layout 的组成_第5张图片

下拉通知栏头部布局

布局文件如下:


【Android系统源码修改】如何分析SystemUI Layout 的组成_第6张图片
根布局



如果将android:layout_width="@dimen/notification_panel_width"改成match_parent,头部布局会铺满屏幕
【Android系统源码修改】如何分析SystemUI Layout 的组成_第7张图片

调节亮度 brightness_mirror

brightness_mirror是通过通知栏调节亮度时,弹出亮度框的布局
【Android系统源码修改】如何分析SystemUI Layout 的组成_第8张图片
【Android系统源码修改】如何分析SystemUI Layout 的组成_第9张图片
super_status_bar.xml
修改其width可以修改layout的宽度

    

你可能感兴趣的:(Android系统源码修改)