SystemUI 显示通知布局文件详解

1.View层级图:

SystemUI 显示通知布局文件详解_第1张图片

 2.View属性:

Type(Id) width height margn layout_gravity visibility special
top bottom
StatusBarWindowView match_parent match_parent         fitsSystemWindows="true"
NotificationPanelView(notification_panel) match_parent match_parent       gone background="@android:color/transparent"
NotificationsQuickSettingsContainer(notification_container_parent) match_parent match_parent     fill_horizontal|top    
NotificationStackScrollLayout(notification_stack_scroller) match_parent match_parent 0dp 32dp fill_horizontal|top   importantForAccessibility="no"

 属性简单介绍:

  • StatusBarWindowView                                                                            SystemUI的根布局
  • NotificationPanelView(notification_panel)                                                SystemUI下来界面的根布局,默认隐藏,接收到下拉操作后显示
  • NotificationsQuickSettingsContainer(notification_container_parent)        快捷设置布局,包含通知,跨界设置按钮 亮度进度条等
  • NotificationStackScrollLayout(notification_stack_scroller)                        通知的根布局

3.特殊设置介绍:

在NotificationStackScrollLayout和NotificationsQuickSettingsContainer有一个特殊设置的写法

32    

在上面android:layout_gravity="@integer/notification_panel_layout_gravity"这种写法很少见但是属于正常设置,在dimen.xml中设置标签,使用integer值来具体设置layout位置,这个是根据常量定义的具体值来使用的。若熟悉APK反编译。可以看到xml文件反编译后所有的等号后的值都会使用常量的具体值来替换,例如:

32    

在dimen.xml中@integer/notification_panel_layout_gravity具体定义如下:


    0x31
    0x37

在源码中截取一些常用的常量值:

/**
 * This view will adjust its padding to fit sytem windows (e.g. status bar)
 */
private static final int FITS_SYSTEM_WINDOWS = 0x00000002;

/**
 * This view is visible.
 * Use with {@link #setVisibility} and {@code
 * android:visibility}.
 */
public static final int VISIBLE = 0x00000000;

/**
 * This view is invisible, but it still takes up space for layout purposes.
 * Use with {@link #setVisibility} and {@code
 * android:visibility}.
 */
public static final int INVISIBLE = 0x00000004;

/**
 * This view is invisible, and it doesn't take any space for layout
 * purposes. Use with {@link #setVisibility} and {@code
 * android:visibility}.
 */
public static final int GONE = 0x00000008;


/**
 * This view does not want keystrokes.
 * 

* Use with {@link #setFocusable(int)} and {@code * android:focusable}. */ public static final int NOT_FOCUSABLE = 0x00000000; /** * This view wants keystrokes. *

* Use with {@link #setFocusable(int)} and {@code * android:focusable}. */ public static final int FOCUSABLE = 0x00000001; /** * This view determines focusability automatically. This is the default. *

* Use with {@link #setFocusable(int)} and {@code * android:focusable}. */ public static final int FOCUSABLE_AUTO = 0x00000010; /** *

Indicates this view can be clicked. When clickable, a View reacts * to clicks by notifying the OnClickListener.

* {@hide} */ static final int CLICKABLE = 0x00004000; /** *

Indicates this view can take / keep focus when int touch mode.

* {@hide} */ static final int FOCUSABLE_IN_TOUCH_MODE = 0x00040000; /** *

* Indicates this view can be long clicked. When long clickable, a View * reacts to long clicks by notifying the OnLongClickListener or showing a * context menu. *

* {@hide} */ static final int LONG_CLICKABLE = 0x00200000; /** * View flag indicating that the screen should remain on while the * window containing this view is visible to the user. This effectively * takes care of automatically setting the WindowManager's * {@link WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON}. */ public static final int KEEP_SCREEN_ON = 0x04000000; /** * View flag indicating whether {@link #addFocusables(ArrayList, int, int)} * should add only Views focusable in touch mode. */ public static final int FOCUSABLES_TOUCH_MODE = 0x00000001;

简单列了一些,详细可参考源码:

http://androidxref.com/8.1.0_r33/xref/frameworks/base/core/java/android/view/View.java

欢迎斧正!

你可能感兴趣的:(Android,SystemUI)