第13篇.NavigationBar

一般来说底部的bar调试被隐藏了的,下面简介一下

1、修改framework的phonewindowmanager.java文件,这个文件是分配窗口多少的,

statusbarNavbar frame的计算是在beginLayoutLw() 中,而对于其它的任何Window frame的计算是layoutWindowLw() ,这部分可以通过layoutWindowLw()函数开头的位置来了解到

setInitialDisplaySize()的mHasNavigationBar = true;决定了是否显示Navbar 状态栏

beginLayoutLw()的mNavigationBarOnBottom = true;参数决定了是显示在底部还是侧边栏

这些参数一般都是在frameworks\base\core\res\res\values\下面的文件里面配置,因为有的项目会遇到覆盖文件的现象,有的在device目录下会覆盖这个值,我就直接在代码里面去设定这个参数的值了,而不是去访问xml获取值

上面修改可以把navbar显示在界面上,对于navbar的显示和隐藏可以到systemui这个apk里面去控制


2、systemui

主要修改的是com.android.systemui.statusbar.phone  包的PhoneStatusBar.java文件

2.1显示和隐藏,通过接受固定广播实现对外的显示隐藏控制,显示和隐藏的主要操作为如下:

    private void xg_ShowNavigationBar() {
        if (DEBUG) Slog.v(TAG, "showNavigationBar: about to add " + mNavigationBarView);
        if (mNavigationBarView == null){
            mNavigationBarView =
                    (NavigationBarView) View.inflate(mContext, R.layout.navigation_bar, null);
                mNavigationBarView.setDisabledFlags(mDisabled);
                mNavigationBarView.setBar(this);
        }
        if(Xg_Bar_Show)return;
        prepareNavigationBarView();

        mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
        Xg_Bar_Show = true;
    }

    private void xg_RemoveNavigationBar() {
        if (DEBUG) Slog.v(TAG, "removeaddNavigationBar: about to add " + mNavigationBarView);
        if (mNavigationBarView == null) return;
        if(!Xg_Bar_Show)return;
        mWindowManager.removeView(mNavigationBarView);
        mNavigationBarView = null;
        Xg_Bar_Show = false;
    }

2.2 click事件

prepareNavigationBarView() 函数里面增加click事件,增加click事件之后图标就可以用了



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章