第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事件之後圖標就可以用了



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