本文作者:清夜

SystemUI之功能介绍和UI布局实现

清夜 5个月前 ( 06-06 ) 29 抢沙发
SystemUI之功能介绍和UI布局实现摘要: SystemUI功能介绍手机中的下拉状态栏,锁屏,通知以及最近打开任务列表等功能都是SystemUI实现的。Android L对SystemUI做的更新比较大,体现在- Notif...

SystemUI功能介绍

手机中的下拉状态栏,锁屏,通知以及最近打开任务列表等功能都是SystemUI实现的。Android L对SystemUI做的更新比较大,体现在

- Notification 和 Quick Settings 被合并在一个界面中

- KeyGuard和SystemUI联系更紧密了,KeyGuard作为一个java lib库供SystemUI调用

- Recents App采用了叠加立体式显示效果,界面更加绚丽。


主要功能点对应的如下所示:


SystemUI主要视图

SystemUI的根视图是在PhoneStatusBar的makeStatusBarView()方法中加载的。


protected PhoneStatusBarView makeStatusBarView() {

    mStatusBarWindow = (StatusBarWindowView) View.inflate(context,

                    R.layout.super_status_bar, null);

}


通过对super_status_bar.xml文件的认识,就能了解SystemUI的大体视图构成。下面贴出省略后的该文件代码片段:


<!-- This is the combined status bar / notification panel window. -->

<com.android.systemui.statusbar.phone.StatusBarWindowView>

    <com.android.systemui.statusbar.BackDropView

            android:id="@+id/backdrop">

        <ImageView android:id="@+id/backdrop_back" />

        <ImageView android:id="@+id/backdrop_front"/>

    </com.android.systemui.statusbar.BackDropView>


    <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_behind"

        />


    <com.android.systemui.statusbar.AlphaOptimizedView

        android:id="@+id/heads_up_scrim"/>


    <include layout="@layout/status_bar"/>


    <FrameLayout android:id="@+id/brightness_mirror">

        <FrameLayout         android:background="@drawable/brightness_mirror_background">

        <include layout="@layout/quick_settings_brightness_dialog"/>

        </FrameLayout>

    </FrameLayout>


    <com.android.systemui.statusbar.phone.PanelHolder

        android:id="@+id/panel_holder">

        <include layout="@layout/status_bar_expanded"/>

    </com.android.systemui.statusbar.phone.PanelHolder>


    <com.android.systemui.statusbar.ScrimView   android:id="@+id/scrim_in_front"/>


</com.android.systemui.statusbar.phone.StatusBarWindowView>


上述view从layout看主要分为三块。

- include进来的status_bar布局,也就是PhoneStatusBarView。

- PanelHolder

- ScrimView


其实这里还漏掉了一个重要的view—-keyguard_bouncer,它不是直接在layout布局里加入的,只有用户设置锁屏保护后才可见。至于ScrimView我在开发中没有修改过,具体作用不甚清楚,在此不做介绍了,以免误人子弟。


PhoneStatusBarView

PhoneStatusBarView主要用来显示系统状态、通知等,主要包括 notification icons 和 status bar icons


PanelHolder

PanelHolder是用户下拉 status bar 后得到的 view。它主要包含 QuickSettings 和 Notification panel 两个部分。PanelHolder是一个继承自FrameLayout的自定义view,它的内容是通过include status_bar_expanded.xml进行填充的。PanelHolder的布局比较复杂,为了提高view的重用性大量的使用了include标签。


keyguard_bouncer

先来看看keyguard_bouncer是个什么样。


需要注意的是keyguard_bouncer view 有多种形式,这里设置的是图案解锁,如果设置的是密码解锁keyguard_bouncer就会以数字键盘的形式显示出来。但无论是哪种解锁模式,都是在KeyguardBouncer类中加载进来的。


/**

* A class which manages the bouncer on the lockscreen.

*/

public class KeyguardBouncer {

    private ViewGroup mRoot;

    private ViewGroup mContainer;


    private void inflateView() {

        mRoot = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.keyguard_bouncer, null);

        mContainer.addView(mRoot, mContainer.getChildCount());

    }

}


关于keyguard_bouncer在什么时候被加载的,加载的具体过程如何,后续在分析,本篇着重分析keyguard_bouncer视图的构成。


总结

以上对SystemUI的主要视图做了介绍,SystemUI的布局还是很复杂的,上述只对主要的视图从大的方向上做了分析,以后碰到具体的SystemUI view显示问题,可以先定位出问题View属于哪个大的分类,然后结合图例给出的id缩小定位范围。

文章版权及转载声明

作者:清夜本文地址:https://blog.youngxq.cn/post/374.html发布于 5个月前 ( 06-06 )
文章转载或复制请以超链接形式并注明出处清夜博客

阅读
分享

发表评论

快捷回复:

验证码

评论列表 (暂无评论,29人围观)参与讨论

还没有评论,来说两句吧...